必须启用-xx:+usegclogfilerotation并配合-xx:numberofgclogfiles=n和-xx:gclogfilesize=size三个参数才能实现gc日志滚动,缺一不可;java 9+改用-xlog:gc*:file=...统一日志配置。

要防止GC日志无节制增长导致磁盘爆满,必须启用日志滚动功能。JVM从Java 7u4起支持 -XX:+UseGCLogFileRotation,但它**不能单独使用**,必须配合其他参数才能生效。
必须配齐的三个核心参数
以下三者缺一不可,否则日志不会滚动:
- -XX:+UseGCLogFileRotation:启用日志轮转机制
- -XX:NumberOfGCLogFiles=N:指定最多保留N个历史日志文件(建议设为3~5)
- -XX:GCLogFileSize=SIZE:单个日志文件大小上限(如10M、50M),支持K/M/G单位
完整推荐配置示例
生产环境常用写法(以输出到/var/log/app/app-gc.log为例):
-Xloggc:/var/log/app/app-gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M
效果:当日志文件达到20MB时自动切新文件,最多保留5个(app-gc.log.0, app-gc.log.1, …, app-gc.log.4),旧文件被覆盖,不占额外空间。
注意事项与常见坑
- 参数名严格区分大小写,不是
NumberOfGCLogFile或GCLogFileCount - 如果指定了
-Xloggc:/path/to/file但路径不存在,JVM启动会失败(不会自动创建目录) - Java 9+ 已弃用
-Xloggc,改用统一日志框架:-Xlog:gc*:file=/path/gc.log:time,tags,level:filecount=5,filesize=20M - 滚动只对GC日志本身生效,不影响应用自身log4j/logback等日志,需另行配置
验证是否生效
启动后检查日志目录:
- 正常应看到类似
app-gc.log、app-gc.log.0、app-gc.log.1的多个文件 - 用
ls -lt /var/log/app/ | head -10观察文件修改时间是否连续滚动 - 运行一段时间后,确认总占用 ≤
NumberOfGCLogFiles × GCLogFileSize










