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

时间:2018-11-26 05:26:51

标签: java java-8 jmc jfr java-mission-control

我想做什么

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

我怎么做

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

  

Java阻止规则要求事件可以从以下事件类型中获得: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>

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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