垃圾收集算法

标记

如果对象在进行可达性分析之后没有发现与GC Roots相连接的引用链,被第一次标记
执行finalize()方法,GC将在对F-Queue中的对象进行第二次标记

1.标记-清除算法

先标记所有需要回收的对象,在标记完成后统一回收所有被标记的对象
1.效率问题:标记和清除两个过程的效率都不高
2.空间问题:标记清除之后会产生大量不连续的内存碎片


2.标记-复制算法

将可用内存按容量分为大小相等的两块,每次只使用其中的一块。当这块的内存快使用完时,就将还存活的对象复制到另一块上,然后再把使用过的内存空间一次清理掉。


内存分为一块较大的Eden空间和两块Survivor空间。Hotspot虚拟机默认Eden和Survivor的比例是8:1,也就是新生代容量为90%。当回收时,将Eden和Survivor中还存活的对象一次性复制到另外一个Survivor空间。如果空间不够,将这些对象直接通过分配担保机制进入老年代。

3.标记-整理算法

先标记所有需要回收的对象,让所有存活的对象向一端移动,然后直接清掉端边界以外的内存。


4.分代收集算法

根据对象存活周期的不同,Java堆分为新生代老年代
在新生代中,每次垃圾收集时都会有大批对象死去,只有少量存活,可以选择复制算法。
老年代中对象存活率高、没有额外空间做担保,使用“标记-清除”或“标记-整理”算法进行回收。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。