使用Java飞行记录器和Java任务控制监控锁 我想做什么
我有一个Java程序,我正在努力改进。我怀疑代码中的同步块会影响性能,但我想在接触代码之前确定这是我的问题 我是怎么说的 为了检查同步块是否确实存在问题,我用飞行记录器在测试服务器上记录了程序的执行情况,在我的桌面上下载了创建的使用Java飞行记录器和Java任务控制监控锁 我想做什么,java,java-8,jmc,jfr,java-mission-control,Java,Java 8,Jmc,Jfr,Java Mission Control,我有一个Java程序,我正在努力改进。我怀疑代码中的同步块会影响性能,但我想在接触代码之前确定这是我的问题 我是怎么说的 为了检查同步块是否确实存在问题,我用飞行记录器在测试服务器上记录了程序的执行情况,在我的桌面上下载了创建的jfr文件,并用Java任务控制打开了它。但是,Java应用程序中的Lock Instances页面没有显示任何内容。我得到的唯一线索是结果视图中的一条消息,内容如下: Java阻止规则要求以下事件类型中的事件可用:com.oracle.jdk.JavaMonitorEn
jfr
文件,并用Java任务控制打开了它。但是,Java应用程序
中的Lock Instances
页面没有显示任何内容。我得到的唯一线索是结果视图中的一条消息,内容如下:
Java阻止规则要求以下事件类型中的事件可用:com.oracle.jdk.JavaMonitorEnter
因此,我假设一定有某种选项可以与飞行记录器一起激活,但到目前为止我还没有找到它
我的问题
如何使Java飞行记录器能够记录com.oracle.jdk.JavaMonitorEnter
类型中的事件?或者我遗漏了其他一些东西,有更好的方法来计算在Java程序中对同步块执行了多少阻塞 我的环境 我使用的是Oracle JDK版本1.8.0u 191。我在桌面上使用的Java任务控制版本是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-XX:+UnlockCommercialFeatures-XX:+UnlockDiagnosticVMOptions-XX:+DebugNonSafepoints-XX:+FlightRecorder-XX:startLightRecording=settings=profile,dumponexit=true,filename=test.jfr-classpath lib/*:src/
我还应该补充一点,使用Java任务控制直接连接到服务器不是一个选项(或者是吗?),因为我正在使用ssh回弹来实际连接到它…我自己做了更多的研究,为我提供了答案 需要在飞行记录器配置文件中指定JavaMonitorEnter事件(以及希望监视的其他事件)。在这种情况下,我使用的是配置文件
profile
配置,它与Oracle JDK的default
配置一起提供
我使用Java任务控制创建了自己的配置。在介绍如何找到在Java任务控制中创建自定义录制配置的工具时非常有帮助
然后,我导出了新创建的配置,将其上载到测试环境中,并在命令中指定了此配置(仅在修改选项下方):
-XX:StartFlightRecording=settings=/home//Custom,。。。
我的实际问题是什么
阻塞录制在Oracle JDK提供的飞行记录器配置中激活。但是,为了实际记录阻塞,它们需要持续超过某个阈值(在默认
配置中为20ms,在配置文件
配置中为10ms)
在我的应用程序中,单个阻塞比这个阈值要短,因此当我在Java任务控制中打开我的记录时,什么都没有出现
我感到困惑的主要原因是,有消息说“Java阻塞规则要求事件可用…”。对我的情况更准确的描述是,没有记录到超过配置阈值的阻塞 在Java 8中,该事件称为“Java/monitor\u enter”,默认情况下,应该为默认配置和概要文件配置启用该事件。。。。所以你应该从一开始就看到。。(JMC 6将旧的Java 8事件ID(Java/monitor_-enter)转换为新的Java 9+ID(JavaMonitorEnter))@Klara如果您是对的,Java/monitor_-enter事件在
default
和profile
配置中都被激活。除了这些设置中的阈值对于我的应用程序太长(在配置文件中为10ms,在默认配置中为20ms)。在我的应用程序中,我试图监视的单个阻塞大约有20微秒长,因此它们不会在以前的配置中显示。
-XX:StartFlightRecording=settings=/home/<username>/Custom,<other options>...