使用Java Flight Recorder和Java Mission Control监视锁

Pat*_*ick 9 java java-8 jmc java-mission-control jfr

我想做的事

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

我是怎么回事的

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

Java阻止规则要求事件可从以下事件类型中获得:com.oracle.jdk.JavaMonitorEnter

因此,我假设必须有一些选项与飞行记录仪一起激活,但到目前为止我无法找到它.

我的问题

如何启用com.oracle.jdk.JavaMonitorEnterJava Flight Recorder记录的类型的事件?
或者我错过了其他的东西,并且有一种更好的方法来计算在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>
Run Code Online (Sandbox Code Playgroud)

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

Pat*_*ick 7

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

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

我使用 Java Mission Control 创建了自己的配置。这篇博客在介绍如何找到在 Java Mission Control 中创建自定义录制配置的工具方面非常有帮助。

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

-XX:StartFlightRecording=settings=/home/<username>/Custom,<other options>...
Run Code Online (Sandbox Code Playgroud)

我的问题实际上是什么

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

在我的应用程序中,单个阻塞比这个阈值短,因此当我在 Java Mission Control 中打开我的录音时什么也没有出现。

我的主要困惑来源是一条消息,指出“Java 阻止规则要求事件可用......”。对我的情况更准确的描述是没有记录超过配置阈值的阻塞