默认情况下,使用 Hotspot,CTRL-Break 线程转储不会列出哪些线程持有java.lang.concurrent
锁。而且我知道使用这些锁,热点无法获得有关在哪个堆栈帧获取锁的信息。如果添加 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)
如果没有这个选项,就不可能在事后分析中找出哪个线程持有这个锁。为什么这个选项不是默认的?是否存在一些不明显的性能或稳定性损失?当我搜索找到有关此的讨论时,什么都没有出现。