使用 Java 飞行记录器和 Java 任务控制监控锁
Monitoring Locks with Java Flight Recorder and Java Mission Control
我想做什么
我有一个 Java 程序,我正在努力改进它。我怀疑代码中的同步块会损害性能,但我想在接触我的代码之前确保这是我的问题。
我是如何进行的
为了检查同步块是否确实是问题所在,我使用 Flight Recorder 在测试服务器上记录了我的程序的执行,在我的桌面上下载了创建的 jfr
文件并使用 [=40= 打开它] 任务控制。但是 Java Application
中的 Lock Instances
页面没有显示任何内容。我得到的唯一线索是“结果”视图中的一条消息,内容为:
The Java Blocking rule requires event(s) to be available from the following event types: com.oracle.jdk.JavaMonitorEnter
因此我假设必须有某种选项可以与飞行记录器一起激活,但到目前为止我没能找到它。
我的问题
如何启用 com.oracle.jdk.JavaMonitorEnter
类型的事件以由 Java 飞行记录器记录?
或者我遗漏了其他东西,有更好的方法来计算在 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 反弹来实际连接到它...
我自己进行的一些研究为我提供了答案。
JavaMonitorEnter 事件(以及其他想要监控的事件)需要在飞行记录器配置文件中指定。在这种情况下,我使用的是 profile
配置,它与 Oracle JDK 的 default
配置一起提供。
我使用 Java Mission Control 创建了自己的配置。 This blog 非常有助于介绍如何在 Java 任务控制中找到创建自定义录制配置的工具。
然后我导出了我新创建的配置,将其上传到我的测试环境并在我的命令中指定了这个配置(仅在修改后的选项下方):
-XX:StartFlightRecording=settings=/home/<username>/Custom,<other options>...
我的实际问题是什么
在 Oracle JDK 提供的飞行记录器配置中激活了阻止记录。但是,要真正记录阻塞,它们需要持续超过某个阈值(default
配置中为 20 毫秒,profile
配置中为 10 毫秒)。
在我的应用程序中,个别阻塞短于此阈值,因此当我在 Java 任务控制中打开我的记录时没有任何显示。
我的主要困惑来源是 "Java Blocking rule required events to be available ..." 的消息。对我的情况更准确的描述是没有记录超过配置阈值的阻塞。
我想做什么
我有一个 Java 程序,我正在努力改进它。我怀疑代码中的同步块会损害性能,但我想在接触我的代码之前确保这是我的问题。
我是如何进行的
为了检查同步块是否确实是问题所在,我使用 Flight Recorder 在测试服务器上记录了我的程序的执行,在我的桌面上下载了创建的 jfr
文件并使用 [=40= 打开它] 任务控制。但是 Java Application
中的 Lock Instances
页面没有显示任何内容。我得到的唯一线索是“结果”视图中的一条消息,内容为:
The Java Blocking rule requires event(s) to be available from the following event types: com.oracle.jdk.JavaMonitorEnter
因此我假设必须有某种选项可以与飞行记录器一起激活,但到目前为止我没能找到它。
我的问题
如何启用 com.oracle.jdk.JavaMonitorEnter
类型的事件以由 Java 飞行记录器记录?
或者我遗漏了其他东西,有更好的方法来计算在 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 反弹来实际连接到它...
我自己进行的一些研究为我提供了答案。
JavaMonitorEnter 事件(以及其他想要监控的事件)需要在飞行记录器配置文件中指定。在这种情况下,我使用的是 profile
配置,它与 Oracle JDK 的 default
配置一起提供。
我使用 Java Mission Control 创建了自己的配置。 This blog 非常有助于介绍如何在 Java 任务控制中找到创建自定义录制配置的工具。
然后我导出了我新创建的配置,将其上传到我的测试环境并在我的命令中指定了这个配置(仅在修改后的选项下方):
-XX:StartFlightRecording=settings=/home/<username>/Custom,<other options>...
我的实际问题是什么
在 Oracle JDK 提供的飞行记录器配置中激活了阻止记录。但是,要真正记录阻塞,它们需要持续超过某个阈值(default
配置中为 20 毫秒,profile
配置中为 10 毫秒)。
在我的应用程序中,个别阻塞短于此阈值,因此当我在 Java 任务控制中打开我的记录时没有任何显示。
我的主要困惑来源是 "Java Blocking rule required events to be available ..." 的消息。对我的情况更准确的描述是没有记录超过配置阈值的阻塞。