如何在Jar文件上运行Java Flight Recorder及指定基准测试项?
在Jar文件上使用JFR的方法与自定义基准测试
当然可以在Jar文件上运行JFR,JFR是JVM内置的性能分析工具,和程序的打包形式无关——只要是运行在支持JFR的JVM(Java 11+默认启用,Java 8u262+需手动开启)上,就能对Jar程序进行性能录制。
操作方法
1. 启动Jar时直接开启JFR
在启动Jar的命令中添加JFR参数,一次性完成程序启动与性能录制:
# 基础录制:指定输出文件和录制时长 java -jar your-application.jar -XX:StartFlightRecording=filename=app-recording.jfr,duration=5m # 使用预设配置(profile为详细分析级,default为轻量监控级) java -jar your-application.jar -XX:StartFlightRecording=filename=app-recording.jfr,settings=profile,duration=10m
录制完成后,生成的.jfr文件可通过JDK自带的jfr命令分析,或导入JDK Mission Control工具查看明细。
2. 运行中动态开启JFR
如果Jar程序已在运行,可通过jcmd工具动态启停录制:
- 第一步:用
jps命令获取Jar程序的进程ID(PID):
输出示例:jps12345 your-application.jar - 第二步:启动录制:
jcmd 12345 JFR.start filename=dynamic-recording.jfr,duration=3m - 第三步:手动停止录制(未指定duration时):
jcmd 12345 JFR.stop name=dynamic-recording
指定基准测试内容
完全可以自定义录制范围,精准聚焦你关注的基准测试点:
- 自定义业务事件:在代码中定义专属JFR事件,针对特定业务操作埋点,比如:
录制时就能专门捕捉这类业务操作的性能数据,用于业务层面的基准测试。import jdk.jfr.Event; import jdk.jfr.Name; @Name("com.yourcompany.BusinessOperation") class BusinessOperationEvent extends Event { public String operationName; public long processingTime; } // 在业务逻辑中触发事件 public void processOrder() { BusinessOperationEvent event = new BusinessOperationEvent(); event.begin(); // 核心业务代码 event.end(); event.operationName = "processOrder"; event.processingTime = event.getDuration().toMillis(); event.commit(); } - 筛选内置事件:启动JFR时通过
events参数指定要录制的具体JVM事件,比如只关注线程阻塞和方法采样:java -jar your-application.jar -XX:StartFlightRecording=filename=focused-recording.jfr,events=jdk.ThreadPark,jdk.MethodSample - 调整采样参数:针对方法采样等事件,调整采样频率适配基准测试需求,比如把方法采样频率设为10毫秒一次:
java -jar your-application.jar -XX:FlightRecorderOptions=samplefrequency=10ms -XX:StartFlightRecording=filename=high-detail-recording.jfr
内容的提问来源于stack exchange,提问作者N_N
相关产品推荐
相关产品推荐

