GC日志配置需按JDK版本选择参数:JDK8及以前用-XX组合参数,JDK9–10为过渡期,JDK11+必须用-Xlog;路径须绝对且权限正确;归档推荐50–100MB/文件、保留7–15个;紧急时可用jcmd动态开启。

GC 日志配置和定期归档不是“配完就完事”的一步操作,而是要匹配 JDK 版本、运行环境和排查目标的持续实践。关键不在堆参数,而在日志能否稳定采集、不丢数据、方便回溯。
按 JDK 版本选对开启方式
不同版本语法差异大,用错会静默失效:
-
JDK 8 及之前:必须组合使用传统参数,缺一不可
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/myapp/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -
JDK 9–10:过渡期,支持旧参数但已引入
-Xlog,建议开始迁移 -
JDK 11 及以上(含 17/21):
-XX:+PrintGCDetails等全部废弃,只认-Xlog
-Xlog:gc*:file=/var/log/myapp/gc.log:time,uptime,pid,tags:filecount=10,filesize=100M
注意:gc*表示所有 GC 相关标签(含 gc,heap、gc,age、gc,metaspace),如只需轻量日志可缩为gc=info;uptime比time更适合分析 GC 时间序列关系
路径与权限必须提前验证
日志写不进磁盘是生产环境最常见失败原因:
- 路径必须用绝对路径,例如
/var/log/myapp/,不能写./logs/gc.log - 启动 JVM 的用户(如
appuser)需对目录有w权限:
sudo chown -R appuser:appuser /var/log/myapp && sudo chmod 755 /var/log/myapp - 首次启动前手动 touch 并测试写入:
sudo -u appuser sh -c 'echo test > /var/log/myapp/gc.log'
归档策略要兼顾分析效率与磁盘安全
单文件过大难传输,过小又频繁轮转,推荐组合设置:
- 单个文件大小设为 50MB~100MB:太大不易下载分析,太小导致 inode 占用高
- 保留文件数设为 7~15 个:覆盖一周高频问题窗口,也防突发 Full GC 暴增
- 不依赖 JVM 自动轮转时,可用 logrotate 辅助(尤其多实例场景):
/var/log/myapp/gc.log {
daily
rotate 7
compress
missingok
create 644 appuser appuser
}
紧急情况可运行时动态启用
线上服务无法重启?JDK 7u40+ 均支持通过 JMX 实时开启:
- 命令行方式(推荐):
jcmdVM.log what=gc output=/tmp/gc_runtime.log - Java 代码调用(适合嵌入诊断模块):
ManagementFactory.getPlatformMBeanServer().invoke(... "vmLog", new Object[]{new String[]{"what=gc"}} ...) - 注意:动态开启的日志默认不带轮转,需人工配合或脚本定时切割
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











