我在启动时通过为被测 Java 程序指定以下 CLI 选项来启动 JFR:
-Xmx24g -XX:+UnlockCommercialFeatures -XX:+FlightRecorder
-XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,settings=profile
测试执行需要 90 秒才能完成。
在 Java Mission Control 中打开 JFR 转储后,JMC 中的 Call Tree 选项卡如下所示:
每秒少于 1 个样本。这使得细节钻取、热门方法和概述选项卡实际上毫无用处。经过初步调查,确定方法采样设置为默认值 10 毫秒,事实证明,这个意外结果是因为在执行各种不同的数据库读取时,大约 98% 的 90 秒用于等待套接字 I/O ,所以我只在另外 2% 的时间里获取方法样本。
如何在方法时间中包含 I/O 绑定样本,以帮助定位花费最多时间等待数据库结果的跟踪?该过程包含多个地方的数据库查询,这些查询又从多个其他地方调用,因此猜测慢速调用路径并不容易。