使用Java Flight Recorder无法查看Spring Batch应用方法平均执行时间怎么办
问题原因及解决方案
1. 缺失JFR采集核心配置
你当前的启动命令未启用JFR采集功能,也没有配置对应事件的采集规则,这是无法看到方法耗时、Contention页无数据的核心原因,需要补充以下配置:
- 启用JFR基础采集:在启动参数中加入
-XX:StartFlightRecording=duration=0s,filename=recording.jfr,settings=profile,其中settings=profile是关键,默认的default配置采集粒度极粗,不会收集方法耗时、锁竞争等细粒度事件。 - 调整方法采样精度:如果需要统计耗时更短的方法,可加入参数
-XX:FlightRecorderOptions=methodsamplinginterval=1ms降低采样间隔,注意采样间隔越小对应用性能影响越高。 - 开启锁竞争事件采集:Contention页仅展示锁竞争相关数据,要采集该类数据需在JFR启动参数中新增阈值配置:
java-monitor-wait-threshold=1ms,java-monitor-inflate-threshold=1ms,park-threshold=1ms,默认20ms的阈值会过滤掉绝大多数短耗时的锁等待事件。
2. 完整优化后启动命令示例
java -Xms2048m -Xmx2048m -Ddivision=25 -Ddate= -Denv=dv -Dconn=45 -XX:StartFlightRecording=duration=0s,filename=batch_recording.jfr,settings=profile,java-monitor-wait-threshold=1ms,java-monitor-inflate-threshold=1ms,park-threshold=1ms -XX:FlightRecorderOptions=methodsamplinginterval=1ms -jar demo-jobs*.jar job-definition.xml jobName -next
3. 方法平均执行时间查看方式
方法平均执行时间不在Contention标签页展示,你需要切换到以下标签页查看:
Hot Methods:可查看所有方法的总采样耗时、调用占比,结合采样次数可计算出平均执行时间Call Tree:可查看调用链上每个节点的累计耗时、自耗时,方便定位链路中的慢节点
如果需要精确的方法执行时长而非采样数据,可开启方法追踪事件(性能开销极大,仅建议测试环境使用),在JFR启动参数中新增method-profiling=enabled,method-profiling-threshold=1ms即可。
4. Contention页无数据的其他可能原因
若添加配置后Contention页仍然无数据,说明你当前运行的Spring Batch应用锁竞争极少,没有触发阈值以上的锁等待事件,属于正常情况。
内容的提问来源于stack exchange,提问作者One Developer
相关产品推荐
相关产品推荐

