java gc日志配置需按jdk版本区分:jdk 8及以前用-xx:+printgc系列参数,jdk 9–10过渡期支持旧参数但推荐-xlog,jdk 11+统一使用功能完备的-xlog,生产环境建议-xlog:gc*:file=gc.log:uptime,tags。

Java 应用性能调优离不开对 GC 行为的可观测性,而开启规范、完整的 GC 日志是第一步。不输出日志,就等于在黑盒里调优——参数改了没效果?停顿时间是否达标?内存分配是否合理?全靠猜。
明确日志目标:记录什么才真正有用
基础日志(如 -XX:+PrintGC)只输出“发生了 GC”和耗时,信息严重不足。生产环境必须启用详细日志,至少包含:
- 每次 GC 的类型(Young / Mixed / Full)、起止时间、各代内存变化(Eden、Survivor、Old 使用量)
- GC 原因(如 “Allocation Failure”、“G1 Evacuation Pause”)
- 暂停时间(
Pause time)和应用停顿总时长(Application stopped) - 元空间、字符串常量池等关键区域使用情况(便于排查非堆 OOM)
推荐配置(JDK 8u262+ / JDK 11+)
统一使用 -Xlog(JDK 10 引入,JDK 9 可选,JDK 8 推荐用旧参数组合):
JDK 11+(推荐):-Xlog:gc*,gc+heap=debug,gc+metaspace=debug,gc+age*=trace:file=gc.log:time,uptime,level,tags:filecount=5,filesize=50M
JDK 8(兼容性强):-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintTenuringDistribution -XX:+PrintReferenceGC -Xloggc:gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=50M
关键细节不能漏
光写日志不够,还要确保它能被有效采集和分析:
-
文件轮转必须开:避免单个日志无限增长占满磁盘,JDK 8 用
-XX:+UseGCLogFileRotation,JDK 11+ 用filecount和filesize -
路径要绝对且可写:比如
/var/log/myapp/gc.log,别用相对路径或默认当前目录 - 时间戳格式建议带 uptime:方便与应用监控(如 Prometheus + JVM Exporter)时间线对齐
-
不要只看日志文本,配合 jstat 实时验证:例如
jstat -gc -h10 <pid> 2s</pid>每2秒刷新一次,快速确认 GC 频率和内存趋势
结合日志做初步诊断
拿到日志后,先扫三类高频问题:
-
频繁 Young GC(如 >50 次/分钟):大概率新生代太小或对象生命周期短但晋升过快,检查
-Xmn和-XX:SurvivorRatio -
Full GC 太多或太慢(>500ms):关注是否由元空间溢出(
Metaspace相关日志)、大对象直接进老年代、或 CMS/G1 触发条件不合理引起 -
停顿时间抖动大:查看日志中
Pause time波动范围,若 G1 下MaxGCPauseMillis设为 200ms 却频繁超 400ms,说明堆太大或 Region 大小不匹配
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











