Skip to content

JVM GC → 内存泄漏 → OOM 排查 追问链

追问路径

Q: JVM的垃圾回收是怎么工作的?
→ 可达性分析 + 分代回收 + 收集器
  Q: 什么情况下会Full GC?
  → 老年代满/元空间满/System.gc()/晋升失败
    Q: Full GC频繁怎么排查?
    → GC日志 + jstat + 内存dump
      Q: 常见的内存泄漏场景?
      → ThreadLocal/静态集合/未关闭资源/监听器
        Q: OOM怎么定位?
        → -XX:+HeapDumpOnOOM + MAT/jmap分析

涉及知识点

核心串联逻辑

  1. 正常 GC:Young GC 清理新生代,Major/Full GC 清理老年代
  2. Full GC 触发:老年代空间不足 / 晋升担保失败 / 元空间不足
  3. 内存泄漏 → Full GC 频繁:对象无法回收但一直新增
  4. 排查路径
    • jstat -gcutil 看 GC 频率和时长
    • -XX:+HeapDumpOnOutOfMemoryError 自动 dump
    • MAT 分析 Dominator Tree 找大对象
    • Arthas dashboard + heapdump 在线诊断
  5. 常见根因:ThreadLocal 未 remove / 缓存无边界 / 连接池泄漏

面试回答串联

"Full GC 频繁通常是内存泄漏导致老年代持续增长。我的排查路径:先 jstat 确认 GC 模式,然后 dump 堆用 MAT 分析支配树找到泄漏对象,常见原因有 ThreadLocal 未清理、静态 Map 无上限等。生产配置 HeapDumpOnOOM 保证第一现场。"