Java 9起引入统一JVM日志(UJL)机制,以-Xlog替代旧GC参数,支持按标签(gc、gc+heap等)、级别(info/debug)、输出目标和装饰器灵活配置GC日志。

Java 中没有所谓“统一 JVM 日志框架”,但自 Java 9 起,JVM 引入了标准化的 统一 JVM 日志(Unified JVM Logging,UJL) 机制,它替代了旧版零散的 GC 日志参数(如 -XX:+PrintGCDetails),用统一语法控制所有 JVM 内部日志(包括 GC、类加载、JIT 编译等)的输出级别、格式和目的地。
启用 GC 相关的统一日志输出
使用 -Xlog 参数开启并配置 GC 日志。基本语法为:
-Xlog:
GC 日志主要涉及以下关键标签(tag):
- gc:核心垃圾回收事件(如 GC 开始/结束、暂停时间)
- gc+heap:堆内存布局与变化(如各代大小、已用/可用空间)
- gc+metaspace:元空间分配与回收详情
- gc+age:对象年龄分布(尤其对 G1/ZGC 有用)
- gc+phases:详细 GC 阶段耗时(如 G1 的 Evacuation、ZGC 的 Pause、Mark 等)
常用 GC 日志配置示例
根据需求选择合适组合,避免过度输出影响性能:
-
基础 GC 摘要(推荐日常使用):
-Xlog:gc*:stdout:time,tags,level
输出 GC 时间戳、事件标签、日志级别到控制台,含暂停时间、回收前后堆大小等。 -
详细 GC + 堆信息(排查内存问题):
-Xlog:gc*,gc+heap=debug:file=gc.log:time,uptime,level,tags
记录到文件,包含堆内存快照(如 Eden/Survivor/Old 区大小变化)。 -
ZGC 或 Shenandoah 低延迟场景(关注暂停与并发阶段):
-Xlog:gc*,gc+phases=debug,gc+heap=debug:file=zgc.log:time,uptime,tags
日志级别与输出控制
UJL 支持标准日志级别:off、error、warning、info(默认)、debug、trace。GC 日志通常用 info 或 debug:
-
info:显示每次 GC 类型、耗时、内存变化(如[0.123s][info][gc] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 12M->3M(16M) 5.234ms) -
debug:额外输出内部细节,如具体 Region 移动数、引用处理耗时等,适合深度调优
输出目标支持 stdout、stderr、file=;装饰器(decorators)如 time、uptime、pid、tids 可增强可读性。
兼容旧参数与注意事项
Java 9+ 仍兼容部分旧参数(如 -XX:+PrintGCDetails),但会自动转换为 -Xlog 并打印警告。建议完全迁移到 -Xlog:
- 避免混用新旧参数,防止行为冲突或日志重复
- 生产环境建议输出到文件,并配合日志轮转(如
file=gc.log,filecount=5,filesize=10M) - 高吞吐场景慎用
trace级别,可能显著增加日志 I/O 开销
不复杂但容易忽略:确保 JVM 启动时参数拼写正确,-Xlog 不区分大小写,但 tag 名必须小写(如 gc+heap 不能写成 GC+Heap)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











