我有一个正在尝试改进的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连接到服务器(或者是吗?)。
答案 0 :(得分:4)
我自己进行了一些进一步的研究,为我提供了答案。
需要在飞行记录器配置文件中指定JavaMonitorEnter事件(以及其他要监视的事件)。在这种情况下,我使用的profile
配置与Oracle JDK的default
配置一起提供。
我使用Java Mission Control创建了自己的配置。 This blog在介绍如何找到用于在Java Mission Control中创建自定义录制配置的工具方面非常有帮助。
然后我导出新创建的配置,将其上传到测试环境中,并在命令中指定此配置(仅在经过修改的选项下方):
-XX:StartFlightRecording=settings=/home/<username>/Custom,<other options>...