Java 面试题
目录

Java 虚拟机 (JVM) 中新生代和老年代分别使用什么垃圾回收算法?

· 约 2 分钟读完 · 第 128 / 274 章

推荐答案

在 Java 虚拟机 (JVM) 中,新生代和老年代分别使用不同的垃圾回收算法:

  • 新生代:通常使用复制算法(Copying Algorithm)。新生代被划分为 Eden 区和两个 Survivor 区(通常称为 From 和 To 区)。垃圾回收时,存活的对象从 Eden 区和 From 区复制到 To 区,然后清空 Eden 区和 From 区。经过多次垃圾回收后仍然存活的对象会被晋升到老年代。

  • 老年代:通常使用标记-清除算法(Mark-Sweep Algorithm)或标记-整理算法(Mark-Compact Algorithm)。标记-清除算法首先标记所有存活的对象,然后清除未标记的对象。标记-整理算法在标记存活对象后,会将它们向一端移动,然后清理掉边界以外的内存。

本题详细解读

新生代的垃圾回收算法

新生代主要存放生命周期较短的对象,因此垃圾回收频率较高。为了高效回收内存,JVM 使用复制算法。该算法的核心思想是将内存分为两块,每次只使用其中一块。当一块内存用完后,将存活的对象复制到另一块内存中,然后清空当前使用的内存块。这种算法的优点是简单高效,适合处理大量短生命周期对象,但缺点是会浪费一部分内存空间。

老年代的垃圾回收算法

老年代主要存放生命周期较长的对象,因此垃圾回收频率较低。由于老年代的对象存活率较高,复制算法不再适用。JVM 通常使用标记-清除算法或标记-整理算法。

  • 标记-清除算法:首先标记所有存活的对象,然后清除未标记的对象。这种算法的优点是实现简单,缺点是会产生内存碎片,可能导致大对象无法分配内存。

  • 标记-整理算法:在标记存活对象后,会将它们向一端移动,然后清理掉边界以外的内存。这种算法的优点是可以减少内存碎片,缺点是移动对象会增加额外的开销。

总结

新生代和老年代的垃圾回收算法选择是基于对象的生命周期和内存使用特点。新生代使用复制算法以高效处理大量短生命周期对象,而老年代使用标记-清除或标记-整理算法以处理长生命周期对象并减少内存碎片。