JVM内存模型回收算法

JVM结构原理,GC工作机制

程序计数器(Program Counter (PC) Register):官方解释是指向当前线程正在执行的字节码指令的地址、行号。明明说了当前线程正在执行的字节码,为什么还要存储它的地址行号呢?原因是CPU工作的原理是有任务调度的,有可能该字节码没有执行完毕就被挂起啦,这样解释可能就容易理解了。

 虚拟机栈(Java Virtual Machine Stacks):栈是一种数据结构,数据结构是存储数据的,因此虚拟机栈就是当前线程运行方法是所需的数据、指令以及返回地址。虚拟机栈是first in last out,里面的每执行一个方法就是一个栈帧,递归的方法(进过实例测试递归多少次就会有多少栈帧)。     

本地方法栈 (Native Method Stacks):本地方法栈与虚拟机栈发挥的功能非常类似,只是虚拟机栈为虚拟机执行java方法而服务,而本地方法栈为虚拟机执行native方法而服务。与虚拟机栈一样,本地方法栈也会抛出 StackOverflowError OutOfMemoryError异常。任何本地方法接口都会使用某种本地方法栈。当虚拟机调用java方法时,虚拟机会创建一个栈帧并且压入虚拟机栈;当虚拟机调用本地(native)方法时,虚拟机不会创建新的栈帧,虚拟机栈会保持不变,虚拟机只是简单的动态连接并直接调用相关的本地方法。     

方法区(Method Area):方法区在JVM中也是一个非常重要的区域,它与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如Stringintern方法。       

(Heap Memory):堆数据区是用来存放对象和数组(特殊的对象)。堆内存由多个线程共享。堆内存随着JVM启动而创建。众所周知,Java中有一个很好的特性就是自动垃圾回收。垃圾回收就操作这个数据区来回收对象进而释放内存。如果堆内存剩余的内存不足以满足于对象创建,JVM会抛出OutOfMemoryError错误。

 

 

JVM结构 1.类加载器 2.执行引擎 3.内存区 4.本地方法接口(主要是调用C或C++实现的本地方法及返回结果)

GC的主要任务: 1.分配内存; 2.确保被引用对象的内存不被错误的回收; 3.回收不再被引用的对象的内存空间 垃圾回收机制的主要解决问题 1.哪些内存需要回收?

针对问题一,垃圾收集器会对堆进行回收前,确定对象中哪些是“存活”,哪些是”死亡“

1.引用计数算法 2.可达性分析算法

2.什么时候回收?

即使是被判断不可达的对象,也要再进行筛选,当对象没有覆盖finalize()方法,或者finalize方法已经被虚拟机调用过,则没有必要执行;
如果有必要执行——放置在F-Queue的队列中——Finalizer线程执行。

3.如何回收?

垃圾收集算法: 1.标记—清除算法 两个阶段:标记,清除; 不足:效率问题;空间问题(会产生大量不连续的内存碎片)

2.复制算法 将可用内存按容量分为大小相等的两块,每次都只使用其中一块; 不足:将内存缩小为了原来的一半 新生代

3.标记—整理算法 标记,清除(让存活的对象都向一端移动) 老年代

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章