3

When I run my jvmti agent with a java program, it seems that jvm encounters a deadlock. In my jvmti agent, I create a single raw monitor in Agent_OnLoad() and enter that lock at the beginning of every callback function and exit that lock at the end of every callback functions. I don't know the reason of this deadlock. Is there any other possibilities of deadlocks in jvmti agents?

thanks.

4

2 回答 2

1

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

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

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

于 2012-10-01T21:45:14.783 回答
0

当多个线程同时调用 JVMTI 代理时,我遇到了同样的问题。一个线程成功调用 RawMonitorEnter 并继续。在此之后,许多其他线程调用 RawMonitorEnter 并按预期阻止。持有原始监视器的线程随后调用 RawMonitorExit,但该函数似乎没有返回,从而导致死锁。

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

于 2017-07-04T13:22:27.070 回答