12

我想做的事

我有一个我正在尝试改进的 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>

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

4

1 回答 1

9

我自己进行的更多研究为我提供了答案。

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

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

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

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

我的问题实际上是

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

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

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

于 2018-11-26T07:50:12.047 回答