1.JavaFlightRecorder简介
JavaFlightRecorder(JFR)是OracleJDK内置的低开销性能监控工具,能够持续记录JVM事件(GC、锁竞争、方法采样、内存分配)。相比传统profiler,JFR开销通常低于2%,可全天候在生产环境开启。Java9+中JFR开源,且支持自定义事件。
参考:https://www.aescc.cn/category/bedroom.html
2.JFR的事件模型
JFR基于事件流:JVM在关键点(如GC开始/结束、线程阻塞)发出事件,JFR将其写入磁盘(循环缓冲区)。用户通过JDKMissionControl(JMC)或jcmd分析。事件类型包括:
即时事件(如Exception、FileRead)
持续事件(如ThreadSleep、SocketRead)
采样事件(如10ms采样线程栈)
3.自定义JFR事件
使用jdk.jfr.Event基类,子类添加字段,在业务代码中调用commit()记录。例如记录订单处理耗时:
classOrderEventextendsEvent{
longorderId;
floatamount;
}
OrderEventevent=newOrderEvent();
event.begin();
//处理订单
event.commit();
JFR会自动记录持续时间。这些事件可以在JMC中可视化过滤。
4.案例:微服务性能瓶颈定位
某微服务间歇性响应慢。开启JFR(-XX:StartFlightRecording),录制30分钟后通过JMC分析:
发现Thread.sleep事件频繁,定位到某处代码主动sleep。
锁竞争事件显示ReentrantLock在特定方法上平均等待200ms。
通过方法采样火焰图,确认某个JSON序列化库性能差。
修复后平均响应时间从500ms降至80ms。
参考:https://www.aescc.cn/category/living-room.html
5.与AsyncProfiler对比
AsyncProfiler也能低开销采样,但JFR是官方内置,支持更多JVM内部事件(如GC、TLAB分配)。JFR也可以与持续集成系统结合,将录制文件自动化分析。
6.生产环境配置建议
使用-XX:+FlightRecorder。
启用-XX:StartFlightRecording=disk=true,maxsize=1g,maxage=1h。
使用-XX:FlightRecorderOptions=stackdepth=128控制栈深度。
通过jcmdJFR.dump动态导出。
7.总结
JFR是Java应用性能诊断的利器,尤其适合生产环境。通过内置事件和自定义事件,开发者可以深入洞察JVM运行细节。掌握JFR,能显著提升定位复杂性能问题的效率。
参考:https://www.aescc.cn