【问题标题】:jvmti agent deadlockjvmti 代理死锁
【发布时间】:2012-08-30 18:46:03
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: deadlock agent jvmti


    【解决方案1】:

    是的,JVMTI 代理中存在死锁的可能性。 JVMTI Reference 声明:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-15
        • 2011-09-01
        相关资源
        最近更新 更多