简体中文
开启 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.134msJava 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的设置。