当我在Java程序中运行我的JVMTI代理时,似乎JVM遇到了死锁。
在我的JVMTI代理中,我在Agent_OnLoad()中创建了一个单一的原始监视器,并在每个回调函数的开头进入该锁定,并在每个回调函数的结尾退出该锁定。
我不知道这个死锁的原因。JVMTI代理中是否还有其他可能导致死锁的情况?
谢谢。
谢谢。
是的,JVMTI代理中存在死锁的可能性。JVMTI参考中指出:
同一线程可能会多次进入监视器。线程必须退出与进入相同次数的监视器。如果在OnLoad期间(在附加线程存在之前)进入监视器并且在附加线程出现时尚未退出,则认为该进入是在主线程上发生的。
在这种情况下进行远程诊断可能很困难,但我建议您查看演示JVMTI应用程序如何处理原始锁定的使用。使用专用函数enter_critical_section
和exist_critical_section
。也许这有所帮助,否则请尝试通过调试代理找到导致死锁的回调。
当多个线程同时调用JVMTI代理时,我遇到了同样的问题。一个线程成功调用RawMonitorEnter并继续执行。此后,一些其他线程调用RawMonitorEnter并阻塞,正如预期的那样。然后持有原始监视器的线程调用RawMonitorExit,但似乎该函数没有返回,导致死锁。
解决方法是将RawMonitorEnter/Exit和它们之间的逻辑包装在互斥锁中。这确保只有一个线程会尝试获取原始监视器。这种解决方法也可能消除对原始监视器的需求。