jvm中可通过参数打印gc日志:jdk 8及以前用-xx:+printgcdetails等,jdk 9+推荐-xlog统一框架,支持筛选、滚动与结构化输出,并可结合g1/zgc等收集器增强参数。

在 JVM 中,可以通过添加特定的 JVM 启动参数来打印详细的 GC 日志,便于分析内存使用、回收频率、停顿时间及各代(Young/Old/Metaspace)的回收行为。
基础 GC 日志参数(JDK 8 及以前)
适用于 JDK 7、8,使用经典的 -XX:+PrintGCDetails 和 -XX:+PrintGCDateStamps 等参数:
-
-XX:+PrintGCDetails:输出每次 GC 的详细信息(如 Eden、Survivor、Old 区大小变化、回收前后占用、耗时等) -
-XX:+PrintGCDateStamps:打印 GC 发生的绝对日期时间(如2024-05-20T14:23:11.123+0800) -
-Xloggc:/path/to/gc.log:指定 GC 日志输出文件路径(必须配合-XX:+PrintGCDetails才有详细内容) -
-XX:+PrintGCTimeStamps:打印相对于 JVM 启动的时间戳(秒级,如123.456),与DateStamps二选一即可 -
-XX:+UseGCLogFileRotation+-XX:NumberOfGCLogFiles=5+-XX:GCLogFileSize=10M:启用日志滚动,避免单个日志过大
JDK 9+ 统一日志框架(推荐方式)
JDK 9 引入了统一的 -Xlog 参数,取代旧参数,更灵活、结构化且支持过滤和输出控制:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
-Xlog:gc*:file=/path/to/gc.log:time,tags,level:filecount=5,filesize=10M—— 开启所有 GC 相关日志(gc*),带时间戳(time)、标签(tags)、日志级别(level),并自动滚动(5 个文件,每个 ≤10MB) - 常用子类筛选示例:
-Xlog:gc+heap+coops=debug(打印堆布局与压缩指针细节)-Xlog:gc+age=trace(显示对象年龄分布,用于调优 Survivor 空间)-Xlog:gc+phases=debug(打印 G1/CMS 等收集器各阶段耗时) - 输出格式更清晰,每行含时间、标签(如
gc,heap)、级别(info)、线程 ID 和内容,方便工具解析
配合常用收集器的增强参数
不同 GC 算法可补充特定参数以获取更深度信息:
-
G1 收集器:
-Xlog:gc+ergo*=trace(查看自适应调优决策)、-Xlog:gc+ref=debug(引用处理详情) -
ZGC(JDK 11+):
-Xlog:gc*,gc+phases=debug,gc+heap=debug(ZGC 停顿极短,需细粒度看并发阶段) -
Parallel / CMS(已弃用但仍有使用):仍可用
-XX:+PrintGCDetails,但建议迁移到-Xlog格式
验证与快速启动示例
运行一个简单 Java 程序并立即触发 GC,快速验证日志是否生效:
- 命令示例(JDK 17):
java -Xlog:gc*:file=gc.log:time,tags:filecount=3,filesize=5M -jar myapp.jar - 检查日志是否包含类似内容:
[2024-05-20T14:30:22.112+0800][info][gc] GC(3) Pause Young (Normal) (G1 Evacuation Pause) 242M->85M(512M) 42.123ms - 若无输出,确认路径可写、JVM 版本支持该参数、未被其他日志配置覆盖(如 Log4j 配置干扰)










