Skip to content
困难

一句话答案

GC 调优核心:选对收集器(G1/ZGC)、合理设置堆大小、分析 GC 日志找到瓶颈、监控 GC 频率和停顿时间。

核心要点

Minor GC(年轻代 GC)触发条件:

  • Eden 区满时触发
  • 特点:频率高,速度快(复制算法 + 存活对象少),STW 时间短(几毫秒到几十毫秒)

Full GC(老年代 + 年轻代 + 方法区)触发条件:

  1. 老年代空间不足(最常见)
  2. System.gc() 被显式调用(建议加 -XX:+DisableExplicitGC 禁止)
  3. Minor GC 的空间担保失败(老年代无法承接晋升的对象)
  4. Metaspace 空间不足
  5. 使用 CMS 时出现 Concurrent Mode Failure(并发清理期间老年代空间不足)

Full GC 期间系统表现(Stop-The-World):

  • JVM 暂停(STW):所有用户线程全部停止,包括正在处理请求的线程
  • 外部表现: 接口响应超时、请求堆积、监控显示 TP99/TP999 突刺
  • 持续时间: 取决于老年代大小和 GC 算法,Serial GC 可能数秒,G1 通常 < 200ms
  • 监控特征: JVM GC 日志中出现 [Full GC ...],GC 耗时远高于 Minor GC

如何减少 Full GC:

  1. 减少大对象创建(避免直接进老年代)
  2. 增大年轻代比例(减少对象晋升老年代)
  3. 升级 G1/ZGC(低停顿 GC)
  4. 定期分析 GC 日志,提前发现内存泄漏
追问与易错

追问方向:

  • 你实际做过 GC 调优吗?调了哪些参数?
  • 怎么判断 GC 是性能瓶颈?(GC 时间占比 >5%)
  • G1 的 MaxGCPauseMillis 设太小会怎样?

易错点:

  • ❌ 盲目调参不看 GC 日志——调优前先分析日志找瓶颈
  • ❌ 只关注停顿不关注吞吐——两者需要平衡

💡 记忆锚点

GC调优铁律:先看日志再动参数。Minor GC看Eden满不满,Full GC五大触发源(老年代满/System.gc/担保失败/Metaspace满/CMF)。Full GC是全场暂停的交通管制,减少它:少造大对象、年轻代给够、换G1/ZGC。