Skip to content

开启 GC 日志

GC 日志的开销极小(通常低于 3%),却是生产事故发生时最有力的排查依据。建议随时、随处开启。

Java 9 及以上(统一日志)

bash
java -Xlog:gc*:file=/var/log/myapp/gc.log:time,uptime,level,tags:filecount=5,filesize=20m -jar app.jar
  • -Xlog:gc* —— 输出所有 GC 相关信息,包括堆大小与停顿阶段(完整的 EasyGC 报告需要它)。
  • file=... —— 通过 filecount / filesize 滚动覆盖,避免日志无限增长。
  • time,uptime —— 每行同时带墙上时间与 JVM 运行时间。

最简配置

-Xlog:gc:file=gc.log 也能用,但 -Xlog:gc* 才能拿到完整信息(分区统计、元空间、各阶段耗时)。

Java 8 及更早版本

bash
java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime \
     -Xloggc:/var/log/myapp/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 \
     -XX:GCLogFileSize=20M -jar app.jar
  • -XX:+PrintGCDetails —— 输出各代明细(年轻代/老年代/元空间),内存分析必备
  • -XX:+PrintGCDateStamps —— 墙上时间戳,便于和应用日志做时间对齐。
  • Java 8u92+ 还可以加 -XX:+PrintGCTimeStamps 输出运行时间戳。

一份合格的日志长什么样

Java 9+(G1):

[2024-05-01T10:00:00.524+0000][0.524s][info][gc] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 412M->34M(1024M) 12.134ms

Java 8(Parallel):

2024-05-01T10:00:01.234+0000: 1.234: [GC (Allocation Failure) [PSYoungGen: 262144K->32768K(305664K)] 262144K->49152K(1007616K), 0.0383211 secs] [Times: user=0.12 sys=0.03, real=0.04 secs]

两者都包含 EasyGC 需要的全部信息:回收何时发生、为何被触发、堆使用从多少到多少堆容量以及 JVM 停了多久

容器环境注意事项

  • 日志写到挂载卷,不要写进容器内部文件系统。
  • JVM 感知的是容器内存限制——顺带确认 -XX:MaxRAMPercentage 的设置。