我想知道是否可以使用JVMTI在Java中动态检测死锁。有两个事件使用synchronized语句指示监视器上的操作:
监视器争用输入
当线程尝试通过另一个线程进入已获取的Java编程语言监视器时发送。
监控已参加竞争
当一个线程在等待另一个线程释放>>后进入Java编程语言监视器时发送。
这意味着,对于JVMTI,我只能看到那些已被锁定的监视器。我想重建一个等待图,但没有事件表明我,获得了一个锁,任何线程都 。这是不可能的。
有替代品吗? Unix上的SIGQUIT命令允许显示死锁的线程转储,看起来这在JVMTI中是不可能的。
答案 0 :(得分:1)
您应该可以通过JMX获取此信息。
尝试
ManagementFactory.getThreadMXBean().findMonitorDeadlockedThreads();