回答
JVM 中有四种常见的垃圾回收算法:
- 标记-清除算法
标记-清除算法分为“标记”和“清除”两个阶段,它通过从 GC Roots 开始标记所有存活的对象,然后遍历堆清除所有未标记的对象。但是该算法可能会产生内存碎片。该算法通常用于老年代垃圾回收,因为老年代对象存活率较高,且不需要频繁回收。
- 复制算法
复制算法将内存区域分为两块,每次只使用其中一块内存。标记存活对象后,JVM 会将这些存活对象复制到另一块内存去,然后清空原来的内存块。该算法的优点是内存回收后,没有内存碎片,但是它浪费了一半的内存块,同时,如果存活的对象较多,则复制的开销会很大。所以它适用于新生代垃圾回收,因为新生代的对象生命周期较短,大部分对象很快就会被回收掉。
- 标记-整理算法
标记-整理算法结合标记-清除算法和复制算法,它的标记阶段和标记-清除算法一致,但是它标记后不是立刻清除,而是将所有存活对象压缩到内存的一端,然后直接清除掉剩余的部分。它解决了标记-清除算法的内存碎片问题,但是在整理过程需要移动大量对象,性能开销较大。
- 分代收集算法