使用 Java 飞行记录器和 Java 任务控制监控锁

Monitoring Locks with Java Flight Recorder and Java Mission Control

我想做什么

我有一个 Java 程序,我正在努力改进它。我怀疑代码中的同步块会损害性能,但我想在接触我的代码之前确保这是我的问题。

我是如何进行的

为了检查同步块是否确实是问题所在,我使用 Flight Recorder 在测试服务器上记录了我的程序的执行,在我的桌面上下载了创建的 jfr 文件并使用 [=40= 打开它] 任务控制。但是 Java Application 中的 Lock Instances 页面没有显示任何内容。我得到的唯一线索是“结果”视图中的一条消息,内容为:

The Java Blocking rule requires event(s) to be available from the following event types: com.oracle.jdk.JavaMonitorEnter

因此我假设必须有某种选项可以与飞行记录器一起激活,但到目前为止我没能找到它。

我的问题

如何启用 com.oracle.jdk.JavaMonitorEnter 类型的事件以由 Java 飞行记录器记录?
或者我遗漏了其他东西,有更好的方法来计算在 Java 程序中对同步块进行了多少阻塞?

我的环境

我正在使用 Oracle JDK 版本 1.8.0_191。我在桌面上使用的 Java Mission Control 版本是 6.0.0。最后,我用来记录程序执行的命令如下:

java -XX:+UnlockCommercialFeatures -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints -XX:+FlightRecorder -XX:StartFlightRecording=settings=profile,dumponexit=true,filename=test.jfr -classpath lib/*:src/ <my program with its arguments>

我还应该补充一点,直接使用 Java Mission Control 连接到服务器不是一个选项(或者是?),因为我正在使用 ssh 反弹来实际连接到它...

我自己进行的一些研究为我提供了答案。

JavaMonitorEnter 事件(以及其他想要监控的事件)需要在飞行记录器配置文件中指定。在这种情况下,我使用的是 profile 配置,它与 Oracle JDK 的 default 配置一起提供。

我使用 Java Mission Control 创建了自己的配置。 This blog 非常有助于介绍如何在 Java 任务控制中找到创建自定义录制配置的工具。

然后我导出了我新创建的配置,将其上传到我的测试环境并在我的命令中指定了这个配置(仅在修改后的选项下方):

-XX:StartFlightRecording=settings=/home/<username>/Custom,<other options>...

我的实际问题是什么

在 Oracle JDK 提供的飞行记录器配置中激活了阻止记录。但是,要真正记录阻塞,它们需要持续超过某个阈值(default 配置中为 20 毫秒,profile 配置中为 10 毫秒)。

在我的应用程序中,个别阻塞短于此阈值,因此当我在 Java 任务控制中打开我的记录时没有任何显示。

我的主要困惑来源是 "Java Blocking rule required events to be available ..." 的消息。对我的情况更准确的描述是没有记录超过配置阈值的阻塞