Java 虚拟机面试题, JVM 新生代垃圾回收如何避免全堆扫描?
Java 虚拟机面试题, JVM 新生代垃圾回收如何避免全堆扫描?
QA
Step 1
Q:: JVM 新生代垃圾回收如何避免全堆扫描?
A:: 在JVM中,为了避免在新生代垃圾回收时对整个堆进行扫描,通常采用的是分代收集算法中的'记忆集' (Remembered Set)
技术。记忆集记录了老年代中引用新生代对象的部分,这样在进行新生代垃圾回收时,只需要检查记忆集中所记录的那些对象,而无需扫描整个老年代。这种机制有效地提高了垃圾回收的效率,减少了不必要的扫描工作。
Step 2
Q:: 什么是分代收集算法?
A:: 分代收集算法是JVM中常用的垃圾回收算法,将内存分为几代(通常是新生代、老年代和永久代)。不同代中的对象有不同的生命周期特点,新生代对象大多生命周期较短,因此采用Minor GC(小规模垃圾回收),而老年代对象存活时间长且数量较多,采用Major GC或Full GC(大规模垃圾回收)。这种分代策略能够更高效地管理不同生命周期的对象内存。
Step 3
Q:: 为什么新生代需要进行垃圾回收?
A:: 新生代中的对象通常是生命周期较短的临时对象,如方法调用中创建的临时变量等。为了避免内存空间的迅速耗尽,需要频繁地对新生代进行垃圾回收,以回收这些不再使用的对象的内存。这就是Minor GC,它比老年代垃圾回收更频繁,但耗时更短。
Step 4
Q:: JVM中GC Roots的作用是什么?
A:: GC Roots是垃圾回收的起点。在垃圾回收的过程中,JVM从GC Roots开始,通过引用链来标记所有存活的对象。未被GC Roots引用到的对象则被视为垃圾,等待回收。常见的GC Roots包括栈中引用的对象、类静态属性引用的对象、常量池中引用的对象,以及JNI引用的对象。
Step 5
Q:: 什么是Minor GC和Major GC?
A:: Minor GC是针对新生代的垃圾回收操作,频率高但速度快;Major GC(也称为Full GC)是针对老年代的垃圾回收操作,发生频率较低,但会回收整个堆,包括新生代和老年代。Major GC通常比Minor GC耗时更长,可能会造成应用的停顿。