默认情况下,使用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)
没有这个选项,就不可能弄清楚在验尸中持有这个锁的线程.为什么此选项不是默认选项?是否存在一些不明显的性能或稳定性惩罚?当我寻找对此的讨论时,什么也没有出现.
我询问 Oracle(我的雇主有支持联系人),答案基本上是该选项可以安全使用,并且默认情况下禁用许多纯诊断功能,这就是这些选项之一。IMO,如果诊断功能安全稳定并且不会造成性能损失,那么它应该默认打开。看来这不是(当时的)Sun 和(现在的)Oracle 的观点。
| 归档时间: |
|
| 查看次数: |
2140 次 |
| 最近记录: |