java 11启用-xlog:gc*:file=gc.log:time,tags,level,pid,tid统一gc日志格式,结构化输出含时间、标签、gc id、类型、内存快照等,支持滚动、过滤与工具分析。

Java 11 引入了统一的 GC 日志格式(Unified JVM Logging),取代了旧版分散、参数繁杂的日志开关(如 -XX:+PrintGCDetails、-Xloggc 等)。它更结构化、可过滤、易解析,是分析 GC 行为的首选方式。
启用新版 GC 日志的关键参数
用 -Xlog 替代所有旧日志选项。核心写法是:
-Xlog:gc*:file=gc.log:time,tags,level,pid,tid
说明:
-
gc*:开启所有 GC 相关标签(如 gc, gc+heap, gc+ergo, gc+ref);也可精简为gc,gc+heap,gc+age -
file=gc.log:输出到文件(不加则输出到 stdout) -
time,tags,level,pid,tid:常用输出修饰符,分别表示时间戳、日志标签、日志级别、进程 ID、线程 ID - 支持滚动:
file=gc.log,filecount=5,filesize=10M(保留 5 个、每个最大 10MB)
识别新版日志的关键字段和结构
每行日志形如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
[2023-04-12T10:23:45.678+0800][12345][gc,heap,exit ] GC(12) Heap after GC invocations=12 (full 0): used 123M, committed 512M, max 2048M
重点看三部分:
-
时间与元信息:方括号内含 ISO 时间、进程 ID、日志标签(如
gc,heap,exit)、GC ID(GC(12)) -
GC 类型与触发原因:如
GC(12) Pause Young (Allocation Failure)表示第 12 次 GC 是年轻代停顿,因分配失败触发 -
内存快照:包括
used/committed/max、各代大小(如 Eden: 128M(128M)->0M(128M))、晋升量、耗时(23.4ms)等
快速定位常见问题的筛选技巧
直接在日志中 grep 或用脚本提取关键模式:
- 查 Full GC:
grep "Full GC" gc.log或grep "Pause Full" gc.log - 查长时间停顿(>100ms):
grep "Pause.*[1-9][0-9]\{2,\}ms" gc.log - 查频繁 GC(单位时间内 GC 次数多):
awk '{print $1}' gc.log | cut -d'[' -f2 | cut -d'T' -f1 | sort | uniq -c | sort -nr - 查内存未释放(Old Gen used 持续上涨):提取
gc+heap+exit行,观察 old 区 used 值趋势
配合工具提升分析效率
纯文本分析较费力,推荐组合使用:
- GCEasy(在线):上传 gc.log 自动出报告,可视化停顿分布、内存趋势、推荐调优项
- GCViewer(桌面 Java 工具):支持新版日志(需 1.35+ 版本),可生成吞吐量、停顿直方图
-
自定义 Python 脚本:用正则匹配
GC\((\d+)\).*Pause.*(\d+\.\d+)ms提取 GC ID 和耗时,统计 P99、平均停顿等 - ELK / Grafana + Loki:将日志接入可观测平台,实现跨实例 GC 指标聚合与告警(如 “Young GC 频率 > 5/s”)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










