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

2024-01-02

默认情况下,对于 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)

如果没有此选项,则无法在事后分析中找出哪个线程持有此锁。为什么这个选项不是默认选项?是否存在一些不明显的性能或稳定性损失?当我搜索有关此问题的讨论时,什么也没有出现。


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么这个 Hotspot JVM 选项不是默认选项? -XX:+PrintConcurrentLocks 的相关文章

随机推荐