标记
如果对象在进行可达性分析之后没有发现与GC Roots相连接的引用链,被第一次标记。
执行finalize()方法,GC将在对F-Queue中的对象进行第二次标记。
1.标记-清除算法
先标记所有需要回收的对象,在标记完成后统一回收所有被标记的对象
1.效率问题:标记和清除两个过程的效率都不高
2.空间问题:标记清除之后会产生大量不连续的内存碎片
2.标记-复制算法
将可用内存按容量分为大小相等的两块,每次只使用其中的一块。当这块的内存快使用完时,就将还存活的对象复制到另一块上,然后再把使用过的内存空间一次清理掉。
内存分为一块较大的Eden空间和两块Survivor空间。Hotspot虚拟机默认Eden和Survivor的比例是8:1,也就是新生代容量为90%。当回收时,将Eden和Survivor中还存活的对象一次性复制到另外一个Survivor空间。如果空间不够,将这些对象直接通过分配担保机制进入老年代。
3.标记-整理算法
先标记所有需要回收的对象,让所有存活的对象向一端移动,然后直接清掉端边界以外的内存。
4.分代收集算法
根据对象存活周期的不同,Java堆分为新生代和老年代。
在新生代中,每次垃圾收集时都会有大批对象死去,只有少量存活,可以选择复制算法。
老年代中对象存活率高、没有额外空间做担保,使用“标记-清除”或“标记-整理”算法进行回收。
网友评论