外观
JVM GC → 内存泄漏 → OOM 排查 追问链
追问路径
Q: JVM的垃圾回收是怎么工作的?
→ 可达性分析 + 分代回收 + 收集器
Q: 什么情况下会Full GC?
→ 老年代满/元空间满/System.gc()/晋升失败
Q: Full GC频繁怎么排查?
→ GC日志 + jstat + 内存dump
Q: 常见的内存泄漏场景?
→ ThreadLocal/静态集合/未关闭资源/监听器
Q: OOM怎么定位?
→ -XX:+HeapDumpOnOOM + MAT/jmap分析涉及知识点
- 垃圾回收算法 — 标记清除/复制/整理
- G1收集器原理 — 现代收集器
- OOM类型与排查 — 堆/栈/元空间/直接内存 OOM
- ThreadLocal原理与内存泄漏 — 常见泄漏源
- Full-GC频繁排查 — 生产排查思路
- Arthas使用实战 — 在线诊断工具
核心串联逻辑
- 正常 GC:Young GC 清理新生代,Major/Full GC 清理老年代
- Full GC 触发:老年代空间不足 / 晋升担保失败 / 元空间不足
- 内存泄漏 → Full GC 频繁:对象无法回收但一直新增
- 排查路径:
jstat -gcutil看 GC 频率和时长-XX:+HeapDumpOnOutOfMemoryError自动 dump- MAT 分析 Dominator Tree 找大对象
- Arthas
dashboard+heapdump在线诊断
- 常见根因:ThreadLocal 未 remove / 缓存无边界 / 连接池泄漏
面试回答串联
"Full GC 频繁通常是内存泄漏导致老年代持续增长。我的排查路径:先 jstat 确认 GC 模式,然后 dump 堆用 MAT 分析支配树找到泄漏对象,常见原因有 ThreadLocal 未清理、静态 Map 无上限等。生产配置 HeapDumpOnOOM 保证第一现场。"