👌jvm垃圾回收算法有哪些?
题目详细答案
垃圾回收算法的核心在于解决两个问题:一是确定哪些对象能够被回收(引用计数法、可达性分析法),二是如何回收这些对象。
引用计数法
引用计数法(Reference Counting)是一种内存管理技术,用于跟踪对象的引用数量。每个对象都有一个引用计数器,记录着指向该对象的引用数量。
当一个对象被引用时,引用计数器加一;当一个引用被释放时,引用计数器减一。当引用计数器为零时,表示没有任何引用指向该对象,该对象可以被释放,回收其占用的内存。
可达性分析法
可达性分析算法是JVM垃圾回收中的一种算法,它通过分析对象的引用关系,判断对象是否可达,从而决定对象是否可以被回收。
标记-清除算法
垃圾收集器首先遍历对象图,标记所有可达的对象,然后清除未标记的对象。简单直接,不需要移动对象。但是会产生内存碎片,可能导致大对象分配失败。
标记-整理算法
在标记阶段标记所有可达的对象后,压缩阶段将存活的对象移动到内存的一端,整理出连续的可用内存空间。这种方式消除了内存碎片问题。但是对象移动需要额外的时间和资源。
复制算法
将内存分为两个相等的区域,每次只使用其中一个。当这个区域使用完时,将存活的对象复制到另一个区域,然后清空当前区域。这种方式简单高效,没有内存碎片问题。缺点就是需要双倍的内存空间。
分代收集算法
根据对象的生命周期将堆内存划分为几代(通常是新生代和老年代),新生代使用复制算法,老年代使用标记-整理或标记-清除算法。优化了垃圾收集性能,因为大部分对象在新生代被收集,减少了老年代的垃圾收集频率。不过需要额外的内存管理和调优。
分区算法
将堆内存划分为多个小的独立区域(Region),每个区域可以独立进行垃圾收集。这种方式提高了内存管理的灵活性和效率,适用于大堆内存的应用。缺点是实现较复杂,需要精细的内存管理。
具体垃圾收集器使用的算法
Serial GC:使用标记-整理算法。
Parallel GC:新生代使用复制算法,老年代使用标记-整理算法。
CMS GC:新生代使用复制算法,老年代使用标记-清除算法,并发标记和清除。
G1 GC:分区算法,结合标记-整理和复制算法。
ZGC:分区算法,使用染色指针和读屏障技术,实现并发标记和压缩。
Shenandoah GC:分区算法,使用并发标记和并发压缩技术。