不同垃圾收集器GC日志核心差异在于字段结构、区域命名、触发原因标识和时间维度:Parallel GC用PSYoungGen标识年轻代,G1用G1 Evacuation Pause并标注(young)/(mixed),ZGC以Pause Mark Start等阶段名体现;Full GC在Parallel中明确标出,G1改用Pause Full或Pause Mixed,CMS退化时显示Concurrent Mode Failure;新版-Xlog:gc*更规范,旧版-XX:+PrintGCDetails则含Times字段区分CPU与挂钟时间;元空间记录方面,G1和ZGC默认输出Metaspace变化,CMS/Parallel需显式参数。

不同垃圾收集器的GC日志格式差异明显,核心区别在于字段结构、区域命名、触发原因标识和时间维度。理解这些差异是准确识别GC类型、定位瓶颈的前提。
年轻代回收行为在日志中的体现
所有收集器都会标明是否为年轻代GC,但表述方式不同:
- Parallel GC(默认吞吐量收集器)用 PSYoungGen 标识年轻代,例如:
[PSYoungGen: 142816K->10752K(142848K)] - G1 GC 使用 G1 Evacuation Pause 并注明分区(如
Eden: 1024M->0M),还会带(young)或(mixed)后缀 - ZGC 和 Shenandoah 在日志中基本不出现“young”字样,而是通过
Pause Mark Start、Pause Relocate等阶段名体现工作性质
老年代与混合回收的标识方式
Full GC 和老年代回收的提示逻辑因收集器而异:
- Parallel GC 的
Full GC行明确表示全堆回收,且会打印ParOldGen区域变化 - G1 GC 不再使用“Full GC”字眼,而是用
Pause Full表示真正意义上的全堆停顿;更多时候看到的是Pause Mixed(混合回收),说明它同时清理了部分老年代分区 - CMS 在并发失败时会退化为
Concurrent Mode Failure: Full GC,日志中会出现ParOldGen或tenured generation字样
时间与触发原因字段的丰富程度
新版JVM(JDK 9+)统一采用 -Xlog:gc* 日志系统后,字段更规范,但旧参数仍广泛使用:
- 使用
-XX:+PrintGCDetails时,Parallel GC 日志含[Times: user=0.55 sys=0.10, real=0.09 secs],区分CPU时间和挂钟时间 - G1 GC 日志中常见
(Allocation Failure)、(G1 Humongous Allocation)、(Evacuation Failure)等具体触发原因 - ZGC 日志以阶段粒度输出,如
Pause Mark Start、Concurrent Mark、Pause Relocate Start,并附带Metaspace和Class区变化
元空间与非堆内存的记录习惯
是否默认打印元空间信息,取决于收集器和JDK版本:
- JDK 8 中 CMS/Parallel GC 需显式加
-XX:+PrintGCDetails才会在进程退出时显示 Metaspace 使用量 - G1 GC(JDK 9+)在每次GC日志末尾常附带
Metaspace: 3241K->3241K(4496K)这类行 - ZGC 默认开启详细元空间日志,且会区分
Metaspace和Class space

















