掌握JVM GC日志分析的关键在于建立“日志—行为—问题”闭环:一行日志对应一次真实内存管理动作,需结合暂停时间、堆变化、各代空间变动、GC原因及趋势指标,精准推断JVM运行状态与潜在异常,并用jmap、jstat、Arthas等工具交叉验证。

掌握 JVM GC 日志分析,关键不在死记参数,而在建立“日志—行为—问题”的闭环理解。它不是纯理论题,而是线上排障的实战能力,复习要围绕“看懂一行日志,就能推断出 JVM 正在做什么、为什么这么做、有没有异常”来展开。
搞清每类 GC 日志对应的实际动作
GC 日志不是流水账,每一行都对应一次真实的内存管理行为:
-
Young GC(如
[GC (Allocation Failure) ...]或[GC pause (young)...]):说明对象在 Eden 区分配失败,触发新生代回收;重点看回收前后 Eden/Survivor 使用量变化,以及是否有对象因 Survivor 空间不足或年龄阈值到达而直接晋升到老年代。 -
Mixed GC(G1 特有,
[GC pause (mixed)...]):不只是清理新生代,还顺带回收部分老年代 Region;出现频繁 Mixed GC 通常意味着老年代碎片化或回收压力增大,需结合-XX:G1MixedGCCountTarget和G1OldCSetRegionNumber日志字段判断回收节奏是否合理。 -
Full GC(
[Full GC (System.gc())...]或[Full GC (Ergonomics)...]):JVM 的“红色警报”。不是所有 Full GC 都因内存不足——可能是显式调用System.gc()、元空间耗尽、CMS 失败后兜底、G1 回收不及导致并发模式失败等。必须结合原因标签(括号内文字)和堆各区域使用率交叉验证。
盯住五个核心数值字段不放
无论日志格式如何变化(Serial、Parallel、CMS、G1、ZGC),以下五组数字始终是诊断起点:
-
时间戳与停顿时间:
0.0158301 secs是 STW 时长,>100ms 就该警惕;多次连续 >200ms 可能引发接口超时。 -
堆内存变化:
32933K->30729K(125952K)表示 GC 前堆占用 32.9MB,GC 后剩 30.7MB,总堆大小 123MB;若回收后仍逼近上限,说明对象存活率高或内存泄漏。 -
新生代三区明细(尤其 G1/ZGC 日志中的
Eden: 1778.0M->0.0B):确认 Eden 是否清空、Survivor 是否扩容、是否有 Humongous 对象被处理。 - 老年代/元空间使用趋势:单独看 Old Gen 或 Metaspace 的“GC 前→GC 后”变化不大,但连续多轮 Full GC 后仍缓慢上涨,大概率存在内存泄漏或动态类加载失控。
-
GC 原因标识:
(Allocation Failure)正常;(Metadata GC Threshold)元空间快满;(Concurrent Mode Failure)CMS 失败;(Evacuation Pause)G1 正常疏散——原因决定排查方向。
用真实日志片段反向推演 JVM 状态
别背模板,拿一段真实输出动手拆解:
2026-10-05T09:23:11.442+0800: 12345.678: [GC pause (G1 Evacuation Pause) (young), 0.0243210 secs]
[Eden: 1524.0M(1524.0M)->0.0B Survivors: 64.0M->64.0M Heap: 4218.2M(8192.0M)->2694.1M(8192.0M)]
你能读出什么?
- 这是 G1 收集器的一次 Young GC,耗时 24ms,属正常范围;
- Eden 区从满(1524M)清空为 0,说明本次回收有效释放了新生代空间;
- Survivor 保持 64M 不变,说明没有新对象晋升,也没有 Survivor 溢出;
- 整个堆从 4218M → 2694M,回收了约 1.5G,效率良好;
- 但堆总容量 8G,当前已用 2.7G,若后续持续增长且未见下降,就要查是不是有大缓存没释放或线程局部变量堆积。
结合工具链验证日志结论
日志只是线索,必须用工具落地验证:
- 看到 Old Gen 缓慢上涨 → 用
jmap -histo:live <pid>查存活对象 Top 排名,再用 MAT 分析支配树; - 怀疑元空间泄漏 → 用
jstat -gcmetacapacity <pid>观察MC(Metaspace Capacity)和MU(Metaspace Used)是否持续扩大; - 发现频繁 System.gc() → 用 Arthas 的
trace java.lang.System gc定位调用方; - 想复现 GC 行为 → 写极简测试类(如不断 new byte[1MB]),配合固定堆参数(
-Xms256m -Xmx256m)反复触发,观察日志规律。


















