Java虚拟机面试题, JVM 新生代垃圾回收如何避免全堆扫描?
Java虚拟机面试题, JVM 新生代垃圾回收如何避免全堆扫描?
QA
Step 1
Q:: Java虚拟机(JVM)新生代垃圾回收如何避免全堆扫描?
A:: 在JVM中,新生代垃圾回收通常使用的是Minor GC,主要通过分代收集算法来避免全堆扫描。新生代(Young Generation)又分为Eden区、S0(Survivor 0)区和S1(Survivor 1
)区。当Eden区满时,Minor GC会开始扫描,但它只扫描新生代区域,避免了对整个堆内存的扫描。为进一步提高效率,JVM使用**写屏障(Write Barrier)和卡表(Card Table)**来记录老年代中可能引用新生代对象的区域,避免了全堆扫描。
Step 2
Q:: Minor GC 和 Major GC 有什么区别?
A:: Minor GC主要针对新生代对象,频繁且速度较快;而Major GC(或Full GC)则涉及老年代(Old Generation)和整个堆,通常速度较慢且对性能影响更大。Major GC可能会导致应用程序长时间暂停(STW),因此需要谨慎管理。
Step 3
Q:: 为什么要分代收集?
A:: 分代收集基于对象生命周期的假设:大部分对象很快变得不可达,因此可以更频繁地回收新生代中的对象。老年代对象生命周期更长,回收频率较低。分代收集有助于减少垃圾回收的频率和全堆扫描的成本。
Step 4
Q:: JVM 中的垃圾回收算法有哪些?
A:: 主要包括:标记-清除(Mark-Sweep)算法、标记-整理(Mark-Compact)算法、复制(Copying)算法和分代收集(Generational Collecting)算法。新生代通常使用复制算法,老年代则使用标记-清除或标记-
整理算法。
Step 5
Q:: CMS(Concurrent Mark-Sweep)和 G1(Garbage-
First)垃圾收集器的区别?
A:: CMS是一种低延迟的垃圾收集器,适合对响应时间敏感的应用,但可能会产生碎片。G1
收集器是更现代的垃圾回收器,旨在替代CMS,它将堆划分为多个区域,并优先回收垃圾最多的区域,减少了长时间停顿,且在回收过程中会进行内存压缩,减少碎片。