当我运行我的Java程序JVMTI代理,似乎JVM遇到死锁。 在我的JVMTI代理,我创建Agent_OnLoad(单原监控),并在每一个回调函数,并退出锁定在每一个回调函数结束的开始输入锁。 我不知道这个僵局的原因。 是否有JVMTI代理死锁的任何其他的可能性?
谢谢。
当我运行我的Java程序JVMTI代理,似乎JVM遇到死锁。 在我的JVMTI代理,我创建Agent_OnLoad(单原监控),并在每一个回调函数,并退出锁定在每一个回调函数结束的开始输入锁。 我不知道这个僵局的原因。 是否有JVMTI代理死锁的任何其他的可能性?
谢谢。
是的,有在JVMTI代理死锁的可能性。 该JVMTI参考规定:
相同的线程可以输入监视器,曾多次。 线程必须退出监视器相同的次数被输入时。 如果的OnLoad内输入监视器(前附线存在),当连接线程进入存在输入被认为是主线程上已发生尚未退出。
它可以是很难做出在这种情况下,远程诊断,但我会建议你好好看看如何演示JVMTI申请办理使用生锁 。 使用专用的功能enter_critical_section
和exist_critical_section
。 也许这会有所帮助,否则试图找到它通过调试代理导致死锁回调。
我打了同样的问题,当多个线程并发调用JVMTI代理。 一个线程调用成功和RawMonitorEnter收益。 在此之后的一些其他线程调用RawMonitorEnter和块,符合市场预期。 线保持原监控器然后调用RawMonitorExit,但现在看来,这个功能没有恢复,这会导致死锁。
一种解决方法是包裹RawMonitorEnter /退出并在一个互斥它们之间的逻辑。 这确保了只有一次一个线程将试图获得原监控。 解决方法也可能会完全否定了原监控的需要。