jdk 8 的 gc 日志格式采用基于文本的结构化输出,默认包含时间戳、gc 类型(如 young gc 或 full gc)、各内存区域(eden、survivor、old)在回收前后的容量变化以及总堆的使用情况。要启用该日志,需在启动参数中添加 -xx:+printgcdetails 和 -xloggc:filename,日志内容会按行记录每次垃圾回收事件的详细指标,便于分析内存分配速率和回收效率。

Young GC 日志中 Eden 区的变化如何解读
Young GC 主要清理新生代空间,日志中会明确显示 Eden 区的从使用量变为零的过程。通过分析 [EDUPS](Eden Previous Size)和 [EDUFS](Eden Free Space)等字段,可以确认对象是否成功晋升或仅被复制到了 Survivor 区。若 Eden 区回收后仍有残留,通常意味着发生了大对象分配直接进入老年代的情况。

java -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintGCTimeStamps -Xloggc:gc.log Main
预期结果示例:
[0.123:][GC (Allocation Failure) [PSYoungGen: 2048K->0K(2560K)] 2048K->1024K(9728K), 0.0012345 secs]
Full GC 日志中 Old 区的状态有何特征
Full GC 会触发全局停顿,日志中 Old 区的容量变化是核心关注点。与 Young GC 不同,Full GC 后的 [OLD] 字段显示的是老年代剩余的使用量,且通常伴随 [PSOldGen] 的详细统计。如果 Full GC 后堆内存依然很高,说明存在内存泄漏或老年代空间不足,此时 [Total] 字段的数值将接近最大堆限制。

java -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintGCTimeStamps -Xloggc:gc_full.log -XX:+HeapDumpOnOutOfMemoryError Main
预期结果示例:
[1.500:][Full GC (Ergonomics) [PSYoungGen: 0K->0K(2560K)] [PSOldGen: 800K->100K(7168K)] 800K->100K(9728K), 0.0056789 secs]
如何根据 GC 日志判断是否需要调整堆大小
通过观察连续 GC 事件中堆使用量的趋势,可以判断当前堆配置是否合理。如果 Young GC 频繁发生但回收效果不佳,或者 Full GC 后老年代使用量迅速回升,说明堆大小可能需要调整。具体做法是结合 -XX:+PrintGCDetails 输出的各代容量数据,计算对象的存活率和晋升频率,从而确定最优的 -Xms 和 -Xmx 值。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











