Java 虚拟机面试题, 为什么 Java 新生代被划分为 S0,S1 和 Eden 区?
Java 虚拟机面试题, 为什么 Java 新生代被划分为 S0,S1 和 Eden 区?
QA
Step 1
Q:: 为什么 Java 新生代被划分为 S0、S1
和 Eden 区?
A:: Java 虚拟机中的新生代(Young Generation)主要用于存放新创建的对象。它进一步划分为三个区域:Eden 区、S0(Survivor 0)和 S1(Survivor 1)。这种划分的主要目的是为了优化垃圾回收(Garbage Collection, GC)的效率。Eden 区是新对象最先分配的区域,当 Eden 区满了时,存活的对象会被复制到 S0 或 S1
区。两个 Survivor 区则用于复制算法的 GC,当一个 Survivor 区中的对象被回收后,会被复制到另一个 Survivor 区。通过这种分区管理,可以减少内存碎片,提高对象回收和管理的效率。
Step 2
Q:: S0 和 S1
的具体作用是什么?
A:: S0 和 S1 主要用于保存从 Eden 区中逃脱(即在 GC 过程中未被回收)的存活对象。这两个区域在垃圾回收时轮流使用,例如在一次 GC 后,存活的对象会从 S0 复制到 S1
或反之。它们的作用是减少在 Eden 区进行垃圾回收时的停顿时间,并且避免直接将存活对象复制到老年代,提升整个 GC 的性能。
Step 3
Q:: Eden 区的内存分配策略是什么?
A:: Eden 区是新对象首先分配内存的地方,默认情况下,所有新对象都会在 Eden 区分配内存。当 Eden 区空间耗尽时,会触发一次 Minor GC,将 Eden 区中存活的对象复制到 S0 或 S1
区。如果对象在经过多次 GC 后仍然存活,它将被提升到老年代。Eden 区的这种分配策略有效地提高了新对象的分配和回收效率。
Step 4
Q:: Minor GC 和 Major GC 的区别是什么?
A:: Minor GC 主要发生在新生代(Eden 和 Survivor 区域),清除不再使用的对象,通常速度较快,影响较小。Major GC(也称为 Full GC)则会涉及整个堆,包括老年代和永久代,清除所有代中的不再使用的对象,通常耗时较长,影响较大。在实际应用中,Minor GC 比 Major GC 更频繁。