我想知道是否可以使用 JVMTI 在 Java 中动态检测死锁。有两个事件使用 synchronized 语句指示监视器上的操作:
监控竞争进入
当一个线程试图进入一个已经被另一个线程获取的 Java 编程语言监视器时发送。
监视器竞争进入
当一个线程在等待另一个线程释放它后进入 Java 编程语言监视器时发送。
这意味着,使用 JVMTI 我只能看到那些已经被锁定的监视器。我想重建一个等待图,但没有事件告诉我,获取了一个不被任何线程持有的锁。这是不可能的。
有替代品吗?Unix 上的 SIGQUIT 命令允许显示死锁的线程转储,这在 JVMTI 中似乎是不可能的。