如何在 Java 飞行记录器采样中包含 IO 绑定方法?

How to include IO-bound methods in Java Flight Recorder sampling?

我在启动时通过为被测 Java 程序指定以下 CLI 选项来启动 JFR:

-Xmx24g -XX:+UnlockCommercialFeatures -XX:+FlightRecorder 
-XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,settings=profile

测试执行需要 90 秒才能完成。

在 Java Mission Control 中打开 JFR 转储后,JMC 中的“调用树”选项卡如下所示:

每秒少于 1 个样本。这使得详细信息向下钻取、热门方法和概述选项卡变得毫无用处。 经过初步调查,确定方法采样设置为默认值 10 毫秒,事实证明,这个意外结果是因为 90 秒中的 ~98% 花在了等待套接字上 I/O 在执行各种不同的数据库读取时,所以我只获得了其他 ~2% 时间的方法样本。

如何在方法时间中包含 I/O 绑定样本,以帮助找到花费最多时间等待数据库结果的跟踪?该进程包含多个地方的数据库查询,这些查询又从其他多个地方调用,因此很难猜测慢调用路径。

JDK8 上的最低方法执行采样率为 10 毫秒,这是您通过配置文件设置获得的值。假设应用程序有负载,这对于 90 秒的记录应该绰绰有余。 JDK 11 中存在导致样本太少的错误,但我可以从屏幕截图中看出您是 运行 较早的版本。

如果您想知道应用程序在等待时在做什么,您应该查看延迟选项卡(不是热方法)或套接字读取/套接字写入选项卡。有 Socket Read、Socket Write、Monitor Blocked、Monitor Wait 等事件,但如果您使用异步 I/O.

则可能不适用

编辑