4

我在启动时通过为被测 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 绑定样本,以帮助定位花费最多时间等待数据库结果的跟踪?该过程包含多个地方的数据库查询,这些查询又从多个其他地方调用,因此猜测慢速调用路径并不容易。

4

1 回答 1

3

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

如果您想知道应用程序在等待时正在做什么,您应该查看 Latency 选项卡(不是 Hot Methods)或 Socket Read / Socket Write 选项卡。有 Socket Read、Socket Write、Monitor Blocked、Monitor Wait 等事件,但如果您使用异步 I/O,则可能不适用。

编辑

在此处输入图像描述

于 2019-04-28T23:52:32.117 回答