2012-09-06 88 views
3

当我用java程序运行我的jvmti代理程序时,似乎jvm遇到了一个死锁。 在我的jvmti代理中,我在Agent_OnLoad()中创建了一个原始监视器,并在每个回调函数的开头输入该锁,并在每个回调函数结束时退出该锁。 我不知道这个僵局的原因。 jvmti代理中是否存在其他可能的死锁?jvmti代理程序死锁

感谢。

回答

1

是的,JVMTI Agent中存在死锁的可能性。 JVMTI Reference指出:

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

它可以是很难做出在这种情况下,远程诊断,但我会建议你去看看demo JVMTI applications如何处理使用生锁。使用专用功能enter_critical_sectionexist_critical_section。也许这有帮助,否则尝试通过调试代理找到导致死锁的回调。

0

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

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