Java Flight Recorder(JFR)是JDK内置低开销诊断工具,推荐用jcmd动态启停、配置profile模式与10ms采样间隔、本地SSD存储并压缩,配合jfr命令快速生成HTML报告或提取关键事件分析。

Java Flight Recorder(JFR)是 JDK 内置的低开销性能诊断工具,无需额外依赖就能采集 CPU、GC、线程、锁、内存分配等底层运行时数据。关键不在于“能不能用”,而在于“怎么配才稳、准、轻”。
启动方式:优先用 jcmd 动态开启,避免重启 JVM
生产环境严禁因调参重启服务。推荐全程使用 jcmd 控制:
- 查进程:
jps -l或jcmd -l获取目标 PID(如12345) - 动态解锁(JDK 8u40 之前需手动):
jcmd 12345 VM.unlock_commercial_features - 启动录制:
jcmd 12345 JFR.start name=prod settings=profile,interval=10ms,maxsize=200M,maxage=6h,filename=/var/log/jfr/app-$(date +%s).jfr - 临时快照(不停止):
jcmd 12345 JFR.dump filename=/var/log/jfr/dump-$(date +%s).jfr - 停止录制:
jcmd 12345 JFR.stop name=prod
参数配置:聚焦三类核心事件,避开采样陷阱
默认配置不适用于生产。必须显式控制事件粒度和频率:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
settings=profile 是生产首选:禁用类加载、JIT 编译细节等高开销事件,只保留
jdk.ExecutionSample(CPU 方法采样)、jdk.GCPhasePause(GC 暂停)、jdk.ThreadPark(线程阻塞)三类关键事件 - interval=10ms 是平衡点:每秒 100 次栈采样,精度足够识别 >1% 占比的方法,开销稳定在 1%–2%;设为 1ms 会显著增加安全点竞争,100ms 则易漏掉短时热点
- 避免
settings=default:它启用大量低频事件,开销可能升至 3%–5%,生产慎用
数据落地:本地 SSD 存储 + 自动轮转,不走网络
JFR 文件写入必须规避网络存储或高延迟磁盘:
立即学习“Java免费学习笔记(深入)”;
- 输出路径指向本地 NVMe/SSD 分区(如
/var/log/jfr/),禁止挂载 NFS 或远程目录 - 用
maxsize=200M防止单文件过大,配合maxage=6h实现自动滚动,避免无限增长占满磁盘 - 启用压缩:
compress=true可减小约 40% 磁盘占用,对 CPU 开销影响极小
分析与报告:用 JDK 原生命令快速生成可读结果
拿到 .jfr 文件后,不必依赖图形界面也能高效分析:
- 导出 HTML 报告:
jfr print --format=html recording.jfr > report.html,打开即见热点方法、GC 时间线、线程状态分布 - 提取关键指标表格:
jfr print --events "jdk.CPULoad,jdk.GCPhasePause" recording.jfr - 定位耗时方法:
jfr print --events jdk.ExecutionSample recording.jfr | grep -E "(methodName|stackTrace)" | head -20 - 配合 JMC 或 JProfiler 打开可交互分析,但原始命令已覆盖 80% 日常排查场景


















