JVM 面试必问的 10 个高频问题:从引用类型到 GC 调优

JVM 是 Java 面试的必考板块。本文整理 10 个高频 JVM 面试题:引用类型、内存区域、类加载、GC 算法、OOM 排查、调优参数等,每题附答题要点,帮你快速建立 JVM 知识框架。

JVM 几乎每场 Java 面试都会出现,从引用类型到内存模型、从类加载到 GC,考点非常集中。下面把最高频的 10 个问题整理成答题框架,照着过一遍就能形成完整知识线。

1. Java 有哪几种引用类型?各自的应用场景

四种引用:强引用(对象可达就不被回收,如常规 new)、软引用(内存不足时才回收,适合做缓存)、弱引用(下次 GC 即回收,如 WeakHashMap)、虚引用(不能获取对象,仅用于跟踪 GC 回收,常配合引用队列)。

考察点:能不能说清"回收时机"和"典型使用场景"。

2. 运行时内存区域怎么划分

程序计数器、虚拟机栈(栈帧:局部变量表/操作数栈)、本地方法栈、堆(新生代 Eden/Survivor + 老年代)、方法区(元空间 Metaspace,JDK8 后本地内存实现)。重点:哪些线程私有、哪些共享,对象的分配路径。

3. 类加载过程与双亲委派

加载 → 验证 → 准备 → 解析 → 初始化。双亲委派:先让父加载器尝试加载,保证核心类不被篡改、避免重复加载。面试常追问:能不能打破双亲委派?→ 可以,重写 loadClass(如 Tomcat、SPI 场景)。

4. 如何判断对象已死

可达性分析(主流):从 GC Roots 出发不可达即回收;引用计数法(有循环引用问题)。GC Roots 包括:栈帧局部变量、静态变量、常量、JNI 引用等。

5. GC 有哪些基本算法

标记-清除(有碎片)、复制(新生代,空间换时间)、标记-整理(老年代,无碎片)、分代收集(新生代复制 + 老年代标记整理)。

6. 常见垃圾收集器怎么选

新生代:Serial、ParNew、Parallel Scavenge;老年代:CMS、Parallel Old、G1(JDK9+ 默认,可预测停顿);ZGC/Shenandoah(低延迟,大堆场景)。

7. OOM 有哪些典型场景,怎么排查

堆内存溢出(对象过多)→ dump 后用 MAT 分析大对象;栈溢出(递归过深);元空间溢出(类加载过多);直接内存溢出(NIO)。

排查清单:jps 找到进程 → jmap dump → 分析 GC 日志与堆直方图 → 定位大对象/内存泄漏点。

8. JVM 常用调优参数

-Xms/-Xmx(堆大小)、-Xmn(新生代)、-XX:MetaspaceSize-XX:+UseG1GC-XX:MaxGCPauseMillis(停顿目标)、-XX:+HeapDumpOnOutOfMemoryError。回答时强调"先压测定位再调参,不是参数越大越好"。

9. 内存泄漏 vs 内存溢出

泄漏是"对象该回收但一直被引用"(如静态集合存对象、未关闭的连接/监听器);溢出是内存不够用。定位泄漏:对比多次 GC 后堆占用是否持续上升。

10. 线上 JVM 出现频繁 Full GC 怎么办

流程:jstat 看 GC 频率与内存分布 → 确认老年代是否过快增长 → dump 分析大对象/缓存 → 检查代码里是否有大集合长期持有 → 必要时调整新生代/老年代比例或换收集器。

写在最后

JVM 的考点其实就围绕"内存 + 类加载 + GC + 排查"四条线。把上面 10 题按框架记熟,再动手敲一遍 jstat/jmap/jstack 的命令,面试基本够用。

如果想把 JVM 这类高频考点练得更熟,可以用 可面猫模拟面试 对着 AI 面试官把这几题过两遍,让 AI 追问细节、帮你查漏补缺。