Java虚拟机面试题, 为什么 Java 的垃圾收集器将堆分为老年代和新生代?
Java虚拟机面试题, 为什么 Java 的垃圾收集器将堆分为老年代和新生代?
QA
Step 1
Q:: 为什么 Java 的垃圾收集器将堆分为老年代和新生代?
A:: Java 的垃圾收集器将堆分为老年代和新生代是为了优化垃圾回收(GC)的效率。新生代(Young Generation)主要用于存放生命周期较短的对象,老年代(Old Generation)则存放生命周期较长的对象。新生代中,垃圾回收更频繁,因为大部分对象都是短命的,可以迅速被回收。而老年代中的垃圾回收则相对少见且耗时更长。通过这种分代机制,垃圾收集器可以集中处理新生代中的垃圾,而不必频繁地扫描整个堆,从而提高了内存管理的效率。
Step 2
Q:: 新生代和老年代的垃圾回收策略分别是什么?
A:: 新生代主要使用的是复制算法(Copying Algorithm)。新生代进一步被划分为 Eden 区和两个 Survivor 区。当进行垃圾回收时,存活的对象会被复制到一个 Survivor 区,而未存活的对象则被清理。当一个对象经历了多次新生代的垃圾回收而仍然存活,它会被提升(Promote)到老年代。老年代使用的垃圾回收算法通常是标记-清除(Mark-Sweep)或标记-整理(Mark-
Compact)算法。这些算法在老年代中运行,因为老年代中的对象存活率较高,复制算法在此不适用。
Step 3
Q:: 什么是 Java 中的Minor GC和Major GC?
A:: Minor GC 主要发生在新生代,当 Eden 区满时,Minor GC 会被触发,回收新生代中不可达的对象。因为新生代中对象大多是短命的,所以 Minor GC 通常是频繁且耗时较短的。Major GC(或 Full GC)则主要针对老年代,回收老年代中的无用对象。由于老年代对象存活率高且空间大,Major GC 通常较少发生但耗时较长。此外,Major GC 通常会引发整个堆的垃圾回收,包括新生代,这可能会导致应用程序的暂停时间较长。