使用Java Flight Recorder和Java Mission Control监控锁定情况

11

我想要做什么

我有一个Java程序,正在尝试改进它。我怀疑代码中的同步块会影响性能,但在修改代码之前,我想确保这是我的问题。

我如何处理它

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

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

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

我的问题

如何启用Java Flight Recorder记录来自com.oracle.jdk.JavaMonitorEnter类型的事件?
或者,我错过了其他内容,是否有更好的方法来确定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 rebound来实际连接到它...


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

10

自己进行了一些研究后,我找到了答案。

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

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

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

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

我的实际问题是什么

Oracle JDK提供的飞行记录器配置中激活了阻塞记录。然而,要实际记录这些阻塞,它们需要持续时间超过一定阈值(在default配置中为20毫秒,在profile配置中为10毫秒)。

在我的应用程序中,个别阻塞的持续时间都比这个阈值短,因此当我在Java Mission Control中打开记录时什么也没有显示出来。

我困惑的主要原因是消息显示“Java Blocking rule required events to be available ...”更准确地描述我的情况应该是没有超过配置阈值的阻塞被记录下来


1
在Java 8中,事件被称为"java/monitor_enter",默认情况下应该对默认和配置文件进行启用...所以你应该从一开始就看到它了。(JMC 6将从旧的Java 8事件ID(java/monitor_enter)翻译成新的Java 9+ ID(JavaMonitorEnter)) - Klara
1
@Klara 你说得对,java/monitor_enter事件在“default”和“profile”配置中都被激活了。只是这些设置中的阈值对于我的应用程序来说太长了(在“profile”配置中为10ms,在“default”配置中为20ms)。 在我的应用程序中,我试图监视的单个阻塞大约为20微秒,因此它们不会显示在这些先前的配置中。 - Patrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接