JVM 堆中几乎存放着java中所有的对象实例,在在垃圾回收前先要判断对象是否已死,这里对对象的判断主要有:
1. 引用计数法
给对象中添加一个引用计数器,每当有一个地方引用他时,计数器就加1;当引用失效时,计数器就减1。任何时间计数器为0时,对象就不可能在次使用。
2. 根搜索法
通过一系列的名为GC Roots 作为起点,从这些节点开始向下搜索,搜索走过的路径成为引用链(Reference Chain), 当一个对象到GC Roots 没有任何引用链时,则说明此对象时不可到达的。
可以作为GC Roots的对象包括:
A. 虚拟机栈中的引用对象
B. 方法区中的常量引用的对象
C. 方法区中类的静态属性引用的对象
D. 本地方法栈中JNI(即:Native方法)的引用的对象
垃圾回收算法
1. 标记-清除算法
标记-清除是最为集成的的算法,主要分为标记、清除两个阶段。首先标记出所有需要回收的对象,在标记完成后,统一进行回收。(如下图)
缺点: 一是效率不高;二是空间碎片多(如果需要一整颗空闲内存,则需要触发一次碎片整理)
2. 复制算法
为提高时间方面效率,复制算法将内存空间安装容量分成大小相等的两块,每次只使用其中一块,当这一刻内存用完时,就将还存活的对象复制到另一块上面,然后再把已经使用过的内存空间一次性清理掉。 如下图:
缺点: 空间利用率非常低,为原内存的一半。
3. 标记-整理算法
由于复制算法在对象存放率较高时,就要执行较多的复制(效率一样变低),更为重要的是不想浪费50%的空间,就需要有格外的空间分配担保,以对应极端情况下所有对象都有100%的存活。(如下图)
原文:http://www.cnblogs.com/dragonflyyi/p/3714107.html