为什么这个Hotspot JVM选项不是默认选项?-XX:+ PrintConcurrentLocks

Edd*_*die 7 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 [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)
Run Code Online (Sandbox Code Playgroud)

没有这个选项,就不可能弄清楚在验尸中持有这个锁的线程.为什么此选项不是默认选项?是否存在一些不明显的性能或稳定性惩罚?当我寻找对此的讨论时,什么也没有出现.

Edd*_*die 3

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