jcmd与JFR
jcmd 和 JFR 是现代 Java 诊断中非常重要的工具。jcmd 提供统一命令入口,JFR 可以低开销记录 JVM 和应用运行事件。
# 1. jcmd 是什么
jcmd 是 JDK 自带的诊断命令工具。
查看 Java 进程:
jcmd
查看某个进程支持的命令:
jcmd <pid> help
# 2. 常用 jcmd 命令
查看 JVM 参数:
jcmd <pid> VM.flags
查看系统属性:
jcmd <pid> VM.system_properties
打印线程:
jcmd <pid> Thread.print
查看堆信息:
jcmd <pid> GC.heap_info
类直方图:
jcmd <pid> GC.class_histogram
生成堆转储:
jcmd <pid> GC.heap_dump /data/dump/heap.hprof
# 3. JFR 是什么
JFR(Java Flight Recorder)是 JVM 内置事件记录系统,可以记录:
- 方法 profiling。
- 对象分配。
- GC。
- 锁竞争。
- 线程状态。
- IO。
- 异常。
- 类加载。
它适合生产环境低开销诊断。
# 4. 启动 JFR
使用 jcmd 启动:
jcmd <pid> JFR.start name=profile settings=profile filename=/data/profile.jfr duration=300s
查看 JFR:
jcmd <pid> JFR.check
停止并导出:
jcmd <pid> JFR.stop name=profile filename=/data/profile.jfr
# 5. 分析 JFR
JFR 文件可以用 JDK Mission Control 打开。
重点关注:
- CPU 热点方法。
- 分配热点。
- GC 事件。
- 锁竞争。
- 线程阻塞。
- Socket 和文件 IO。
- 异常抛出频率。
JFR 的优势是能把多个维度放在同一条时间线上观察。
# 6. 什么时候用 JFR
适合:
- CPU 高但线程栈不够明确。
- 延迟抖动。
- 分配速率异常。
- 锁竞争。
- GC 与业务延迟关联分析。
- 偶发线上问题。
不适合:
- 已经明确的简单配置问题。
- 无法承受任何额外开销的极端场景。
# 7. 阶段小结
jcmd 是现代 JVM 诊断的统一入口,JFR 是低开销运行时记录工具。相比只看单次线程栈或堆 dump,JFR 能把 CPU、分配、GC、锁和 IO 事件放在时间线上,是排查复杂性能问题的重要武器。
# 8. JFR 事件时间线
时间轴
10:00:01 Socket Read 慢
10:00:02 大量对象分配
10:00:03 Young GC 80ms
10:00:04 Monitor Blocked
10:00:05 接口 RT 抖动
JFR 的价值是把不同类型事件放在同一时间线上,帮助判断因果关系。
# 9. JFR settings 选择
| settings | 特点 | 适用 |
|---|---|---|
default | 开销低,信息适中 | 长时间生产观察 |
profile | 信息更多,开销更高 | 短时间性能分析 |
生产环境通常先用 default 长时间记录;定位热点时短时间使用 profile。
# 10. Tips 快问快答
Q:JFR 可以线上开吗?
A:通常可以,尤其是 default 配置开销较低。但仍应结合业务敏感度评估。
Q:JFR 和 APM 有什么区别?
A:APM 更偏业务链路和服务监控,JFR 更贴近 JVM 内部事件。
Q:JFR 能替代 heap dump 吗?
A:不能。JFR 能看分配趋势和热点,heap dump 更适合分析完整对象引用链。
Q:jcmd 需要应用提前开启什么吗?
A:大部分基础命令不需要,但 JFR 能力依赖 JDK 支持和运行权限。
上次更新: 2026/06/24, 16:03:01