JVM中的垃圾回收器算法

JVM中的垃圾回收器算法主要有以下几种:

分代收集理论

当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。比如在新生代中,每次收集都会有大量对象(近99%)死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。注意,“标记-清除”或“标记-整理”算法会比复制算法慢10倍以上。

复制算法(Copying):

复制算法将堆空间分为两个区域,每次只使用其中一个区域,当一个区域用完后,将其中的存活对象复制到另一个区域中,然后清空当前区域。这种算法的优点是不会产生内存碎片,但是需要浪费一半的空间。

标记-清除算法(Mark-Sweep):

算法分为“标记”和“清除”阶段:标记存活的对象,统一回收所有未被标记的对象(一般选择这种);也可以反过来,标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。它是最基础的收集算法,比较简单,但是会带来两个明显的问题:

1.效率问题(如果需要标记的对象太多,效率不高)
2.空间问题(标记清除后会产生大量不连续的碎片)

标记-整理算法(Mark-Compact):

根据老年代的特点特出的一种标记算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。

分代算法(Generational):

分代算法是将堆空间分为年轻代和老年代两部分。年轻代中的对象生命周期较短,老年代中的对象生命周期较长。使用不同的垃圾回收算法来处理不同区域的对象。年轻代中通常采用复制算法,而老年代中通常采用标记-清除或标记-整理算法。

清除-增量算法(Sweeping):

清除-增量算法是一种优化算法,它将垃圾回收过程分成多个阶段,每个阶段都可以让应用程序执行一段时间。这样可以让垃圾回收过程与应用程序执行交替进行,减少垃圾回收对应用程序的影响。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容