Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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 为什么这个热点JVM选项不是默认选项-XX:+;打印并发锁_Java_Stack Dump - Fatal编程技术网

Java 为什么这个热点JVM选项不是默认选项-XX:+;打印并发锁

Java 为什么这个热点JVM选项不是默认选项-XX:+;打印并发锁,java,stack-dump,Java,Stack Dump,默认情况下,对于Hotspot,CTRL-Break线程转储不会列出哪些线程持有java.lang.concurrent锁。我知道有了这些锁,Hotspot就不能知道锁是在哪个堆栈帧上获得的。如果添加JVM选项-XX:+PrintConcurrentLocks,则CTRL-Break堆栈转储将列出(在线程堆栈跟踪之后)该帧持有的所有并发锁。例如: "D-Java-5-Lock" prio=6 tid=0x00000000069a1800 nid=0x196c runnable [0x000000

默认情况下,对于Hotspot,CTRL-Break线程转储不会列出哪些线程持有
java.lang.concurrent
锁。我知道有了这些锁,Hotspot就不能知道锁是在哪个堆栈帧上获得的。如果添加JVM选项
-XX:+PrintConcurrentLocks
,则CTRL-Break堆栈转储将列出(在线程堆栈跟踪之后)该帧持有的所有并发锁。例如:

"D-Java-5-Lock" prio=6 tid=0x00000000069a1800 nid=0x196c runnable [0x000000000770f000]
   java.lang.Thread.State: RUNNABLE
      at com.Tester.longDelay(Tester.java:41)
      at com.Tester$D.run(Tester.java:88)

   Locked ownable synchronizers:
      - <0x00000007d6030898> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
“D-Java-5-Lock”优先级=6 tid=0x00000000069a1800 nid=0x196c可运行[0x000000000770f000]
java.lang.Thread.State:可运行
位于com.Tester.longDelay(Tester.java:41)
在com.Tester$D.run(Tester.java:88)
锁定可拥有的同步器:
-(一个java.util.concurrent.locks.ReentrantLock$NonfairSync)

如果没有这个选项,就不可能在验尸中找出哪个线程持有这个锁。为什么此选项不是默认选项?是否存在一些不明显的性能或稳定性惩罚?当我搜索查找关于这个的讨论时,什么都没有出现。

好吧,我的猜测是它不稳定,或者JVM维护人员(现在的Sun Oracle)根本不想将它作为受支持的功能进行维护。您只需通过
-XX:
前缀即可看出这一点:

使用-XX指定的选项不稳定,不建议随意使用。这些选项如有更改,恕不另行通知

-从

同样在该页面中,可以通过JDK管理接口动态启用或禁用该选项,因此如果需要,可以通过MXBean启用它

标记为可管理的标志可通过JDK管理接口(com.sun.management.HotSpotDiagnosticXbean API)和JConsole动态写入。在监视和管理JavaSE6平台应用程序时,图3显示了一个示例。也可以通过jinfo-flag设置可管理的标志


最后,堆栈跟踪工具可以在任何时候执行相同的功能,而不需要一直启用它。

我询问了Oracle(我的雇主有一个支持联系人),答案基本上是该选项使用安全,默认情况下禁用了许多纯诊断功能,这是其中的一个选项。在我看来,如果一个诊断功能是安全和稳定的,并且不会带来性能损失,那么它在默认情况下应该是打开的。这似乎不是(当时)Sun和(现在)Oracle的观点。

因为只有可重入锁知道它们与哪些线程相关。要获得有关此方法的运行时实现的信息,请通过堆查找所有锁及其线程

添加解释。