JDK 8及以前用-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps组合获取详细GC日志;JDK 9+必须用-Xlog:gc*:stdout:time,uptime,pid,tags等参数替代。

直接加参数启动即可实时看到 GC 日志,但要注意 JDK 版本差异较大,-verbose:gc 在新版本中已被弃用,实际效果有限,需配合更精确的参数才能获得频率和耗时等关键信息。
JDK 8 及以前:用 -verbose:gc + -XX:+PrintGCDetails
单独用 -verbose:gc 只输出简略日志(如 [GC 1234K->567K(2048K), 0.0021234 secs]),无法区分 Young/Old GC 类型,也缺少时间戳和停顿详情。建议组合使用:
-
-verbose:gc:开启基础 GC 日志(兼容性好) -
-XX:+PrintGCDetails:打印详细信息(回收前后大小、区类型、耗时) -
-XX:+PrintGCTimeStamps:添加 JVM 启动后的相对时间戳(秒级) - (可选)
-Xloggc:gc.log:把日志重定向到文件,避免控制台刷屏
示例启动命令:
java -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log MyAppJDK 9 及以后:必须用 -Xlog 替代旧参数
-verbose:gc 在 JDK 9+ 中仅作为别名存在,实际被映射为 -Xlog:gc,但功能受限。要获取完整频率与耗时,应显式使用 -Xlog 并指定标签和级别:
立即学习“Java免费学习笔记(深入)”;
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
-
-Xlog:gc*:stdout:time,uptime,level,tags:输出带时间戳、运行时长、日志等级和 GC 类型标签的完整日志 -
-Xlog:gc+heap=debug:额外查看堆内存变化细节(如各代容量与使用量) -
-Xlog:gc+pause=info:专注打印 Stop-The-World 停顿耗时(即真正影响响应时间的部分)
常用组合(兼顾可读性与关键指标):
java -Xlog:gc*:stdout:time,uptime,pid,tags -Xms2g -Xmx2g MyApp如何从日志判断频率与耗时
关注每条 GC 日志中的两个核心字段:
-
时间戳:如
[2024-05-20T14:23:11.123+0800]或[12345.678s],相邻日志的时间差即 GC 间隔 -
耗时:末尾的
[Times: user=0.01 sys=0.00, real=0.007 secs]中real表示实际暂停时间(Wall Clock Time),是衡量 GC 影响的关键值
例如连续两条日志时间差 3.2 秒,real 耗时 0.015 秒,说明该次 GC 每 3 秒左右发生一次,每次暂停约 15 毫秒。
辅助技巧:用工具或脚本简化分析
手动数日志效率低,可配合以下方式快速统计:
- Linux 下用
grep "GC " gc.log | awk '{print $1,$2,$NF}'提取时间与耗时 - 用 GCViewer 加载 gc.log 文件,自动生成频率分布图、停顿时间趋势图
- JDK 自带
jstat -gc <pid> 1000</pid>实时查看 GC 统计(不依赖日志,适合生产环境临时诊断)


















