Java虚拟机面试题, 什么条件会触发 Java 的 young GC?
Java虚拟机面试题, 什么条件会触发 Java 的 young GC?
QA
Step 1
Q:: 什么条件会触发 Java 的 young GC?
A:: 在 Java 虚拟机中,young GC(又称为 Minor GC)是在年轻代内存(包括 Eden 区和两个 Survivor 区)满了之后触发的。当创建新对象时,内存分配器首先在 Eden 区分配空间。当 Eden 区的内存使用超过某个阈值时,年轻代会触发一次 young GC。此时,Eden 区中存活的对象将被复制到一个 Survivor 区,无法进入 Survivor 区的对象可能会被提升到老年代。
Step 2
Q:: young GC 与 full GC 的区别是什么?
A:: young GC 只清理年轻代的内存,而 full GC 则清理整个堆,包括年轻代、老年代和永久代/
元空间。young GC 的频率通常较高,但耗时较短,而 full GC 的频率较低,但可能会导致应用程序的暂停时间较长。
Step 3
Q:: Java 的老年代内存何时会触发 GC?
A:: 老年代内存会在以下几种情况下触发 GC(即 Major GC 或 Full GC):1)老年代内存满了。2)永久代/元空间(在 JDK 8 及之后)空间不足。3)System.gc()
方法被显式调用时,虚拟机可能会触发一次 full GC(具体行为由 JVM 的参数决定)。
Step 4
Q:: CMS 与 G1
垃圾收集器的区别是什么?
A:: CMS(Concurrent Mark-Sweep)是一种基于标记-清除算法的垃圾收集器,专注于减少 GC 的停顿时间,但容易产生内存碎片。G1(Garbage-First)则是更现代的垃圾收集器,它将堆划分为多个区域,并优先清理包含最多垃圾的区域,能够提供更可预测的停顿时间。G1
还集成了压缩机制,可以有效减少内存碎片。
Step 5
Q:: 什么是 Java 的元空间(Metaspace),它的作用是什么?
A:: Java 的元空间(Metaspace)在 JDK 8
之后替代了永久代(PermGen)。它存储类的元数据信息,包括类名、方法、字段等。与永久代不同,元空间不是堆内存的一部分,而是直接使用本地内存,减少了内存管理的复杂性,并且避免了由于永久代不足而导致的内存溢出问题。