JVM 堆中几乎存放着java中所有的对象实例,在在垃圾回收前先要判断对象是否已死,这里对对象的判断主要有:

1.  引用计数法

给对象中添加一个引用计数器,每当有一个地方引用他时,计数器就加1;当引用失效时,计数器就减1。任何时间计数器为0时,对象就不可能在次使用。

2.  根搜索法

通过一系列的名为GC Roots 作为起点,从这些节点开始向下搜索,搜索走过的路径成为引用链(Reference Chain), 当一个对象到GC Roots 没有任何引用链时,则说明此对象时不可到达的。

可以作为GC Roots的对象包括:

A. 虚拟机栈中的引用对象

B. 方法区中的常量引用的对象

C. 方法区中类的静态属性引用的对象

D. 本地方法栈中JNI(即:Native方法)的引用的对象

JVM 学习笔记(二)-LMLPHP

垃圾回收算法

1. 标记-清除算法

标记-清除是最为集成的的算法,主要分为标记、清除两个阶段。首先标记出所有需要回收的对象,在标记完成后,统一进行回收。(如下图)

JVM 学习笔记(二)-LMLPHP

缺点: 一是效率不高;二是空间碎片多(如果需要一整颗空闲内存,则需要触发一次碎片整理)

2.  复制算法

为提高时间方面效率,复制算法将内存空间安装容量分成大小相等的两块,每次只使用其中一块,当这一刻内存用完时,就将还存活的对象复制到另一块上面,然后再把已经使用过的内存空间一次性清理掉。 如下图:

JVM 学习笔记(二)-LMLPHP

缺点: 空间利用率非常低,为原内存的一半。

3.  标记-整理算法

由于复制算法在对象存放率较高时,就要执行较多的复制(效率一样变低),更为重要的是不想浪费50%的空间,就需要有格外的空间分配担保,以对应极端情况下所有对象都有100%的存活。(如下图)

JVM 学习笔记(二)-LMLPHP

05-12 18:30