JVMTI代理死锁

3
当我在Java程序中运行我的JVMTI代理时,似乎JVM遇到了死锁。 在我的JVMTI代理中,我在Agent_OnLoad()中创建了一个单一的原始监视器,并在每个回调函数的开头进入该锁定,并在每个回调函数的结尾退出该锁定。 我不知道这个死锁的原因。JVMTI代理中是否还有其他可能导致死锁的情况?
谢谢。
2个回答

1

是的,JVMTI代理中存在死锁的可能性。JVMTI参考中指出:

同一线程可能会多次进入监视器。线程必须退出与进入相同次数的监视器。如果在OnLoad期间(在附加线程存在之前)进入监视器并且在附加线程出现时尚未退出,则认为该进入是在主线程上发生的。

在这种情况下进行远程诊断可能很困难,但我建议您查看演示JVMTI应用程序如何处理原始锁定的使用。使用专用函数enter_critical_sectionexist_critical_section。也许这有所帮助,否则请尝试通过调试代理找到导致死锁的回调。


0

当多个线程同时调用JVMTI代理时,我遇到了同样的问题。一个线程成功调用RawMonitorEnter并继续执行。此后,一些其他线程调用RawMonitorEnter并阻塞,正如预期的那样。然后持有原始监视器的线程调用RawMonitorExit,但似乎该函数没有返回,导致死锁。

解决方法是将RawMonitorEnter/Exit和它们之间的逻辑包装在互斥锁中。这确保只有一个线程会尝试获取原始监视器。这种解决方法也可能消除对原始监视器的需求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接