当我用java程序运行我的jvmti代理时,似乎jvm遇到了死锁。 在我的jvmti代理中,我在Agent_OnLoad()中创建一个原始监视器,并在每个回调函数的开头输入该锁,并在每个回调函数结束时退出该锁。 我不知道这种僵局的原因。在jvmti代理中还有其他可能的死锁吗?
感谢。
答案 0 :(得分:1)
是的,JVMTI Agent可能会出现死锁。 JVMTI Reference州:
同一个线程可能会多次进入监视器。线程必须 退出监视器的次数与输入的次数相同。如果一个 在OnLoad期间输入监视器(在连接的线程存在之前)和 当附加线程存在时,没有退出,输入是 被认为发生在主线上。
在这种情况下进行远程诊断可能很困难,但我建议你看看demo JVMTI applications如何处理原始锁的使用。使用专用函数enter_critical_section
和exist_critical_section
。也许这有帮助,否则尝试通过调试代理来找到导致死锁的回调。
答案 1 :(得分:0)
当多个线程同时调用JVMTI代理时,我遇到了同样的问题。一个线程成功调用RawMonitorEnter并继续。在此之后,许多其他线程按预期调用RawMonitorEnter和block。持有原始监视器的线程然后调用RawMonitorExit,但看起来这个函数没有返回,这导致死锁。
解决方法是将RawMonitorEnter / Exit以及它们之间的逻辑包装在互斥锁中。这确保了一次只有一个线程会尝试获取原始监视器。解决方法也可能完全否定对原始监视器的需求。