CodeWalk

JFR与JMC:JDK飞行记录器和Mission Control详解

作者:我是大山 · 2026-05-30 12:55

请详细解释**JFR(JDK Flight Recorder,飞行记录器)JMC(JDK Mission Control)**的用法。JFR如何实现低开销的JVM事件采集(CPU/内存/GC/IO/线程/锁等)?如何使用JMC分析JFR文件?JFR与传统的JVM参数(如-XX:+PrintGCDetails)相比有什么优势?

回答

我是大山

JFR(JDK Flight Recorder)

JFR是内置于JDK的低开销事件采集框架,开销通常<1%。

采集的事件类型

  • GC事件:分配速率、GC暂停、晋升大小、碎片
  • CPU事件:CPU负载、方法CPU消耗(采样)
  • 内存事件:TLAB分配、对象分配、堆使用率
  • 线程事件:线程阻塞、锁竞争、线程休眠
  • IO事件:文件读写、Socket读写
  • 异常事件:异常抛出的类型和频率
  • 代码事件:编译、代码缓存、类加载

启动JFR

# 启动时自动记录(持续60分钟)
java -XX:StartFlightRecording:filename=recording.jfr,duration=60s,settings=profile MyApp

# 运行时动态启动
jcmd <pid> JFR.start name=myrecording duration=60s filename=/tmp/rec.jfr settings=profile

# 停止并dump
jcmd <pid> JFR.stop name=myrecording
jcmd <pid> JFR.dump name=myrecording filename=/tmp/rec.jfr

配置模板

  • default.jfc:默认,开销<1%,适合持续开启
  • profile.jfc:采样更频繁,开销约2%,适合短期深入分析

JMC(JDK Mission Control)

JMC是JFR的可视化分析工具,提供丰富的图表和自动分析建议。

核心功能

  1. 自动分析:自动检测潜在问题(如锁竞争、GC频繁、内存泄漏等)
  2. GC分析:GC暂停时间分布、各代容量变化、分配压力
  3. Java应用分析:热点方法(采样)、异常统计、线程等待
  4. 内存泄漏检测:通过对象分配栈追踪,定位高频分配代码

JFR优势对比

维度JFR传统GC日志(-XX:+PrintGCDetails)
开销<1%影响极小
数据类型事件驱动,包含上下文纯文本,解析困难
CPU分析支持(采样)不支持
锁分析支持不支持
内存分配支持(TLAB+对象采样)不支持
自动分析JMC提供可视化 + 规则分析需第三方工具(GCeasy)
运行时开启支持(jcmd动态控制)不支持

开启建议

# 生产环境持续开启default.jfc
java -XX:+FlightRecorder -XX:StartFlightRecording=settings=default,disk=true,maxage=24h,maxsize=500MB,filename=/var/log/app.jfr MyApp