Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java飞行记录器和Java任务控制监控锁 我想做什么_Java_Java 8_Jmc_Jfr_Java Mission Control - Fatal编程技术网

使用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

我有一个Java程序,我正在努力改进。我怀疑代码中的同步块会影响性能,但我想在接触代码之前确定这是我的问题

我是怎么说的 为了检查同步块是否确实存在问题,我用飞行记录器在测试服务器上记录了程序的执行情况,在我的桌面上下载了创建的
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>...