jvmti代理死锁

时间:2012-09-06 01:18:46

标签: deadlock agent jvmti

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

感谢。

2 个答案:

答案 0 :(得分:1)

是的,JVMTI Agent可能会出现死锁。 JVMTI Reference州:

  

同一个线程可能会多次进入监视器。线程必须   退出监视器的次数与输入的次数相同。如果一个   在OnLoad期间输入监视器(在连接的线程存在之前)和   当附加线程存在时,没有退出,输入是   被认为发生在主线上。

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

答案 1 :(得分:0)

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

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