【问题标题】:Deadlock detection with JVMTI使用 JVMTI 进行死锁检测
【发布时间】:2011-06-02 15:09:06
【问题描述】:

我想知道是否可以使用 JVMTI 在 Java 中动态检测死锁。使用 synchronized 语句有两个事件指示监视器上的操作:

监控竞争进入

当一个线程试图进入一个 Java 编程语言监视器已经被另一个线程获取时发送。

显示器竞争进入

当一个线程等待另一个线程释放之后进入 Java 编程语言监视器时发送。

这意味着,使用 JVMTI 我只能看到那些已经被锁定的监视器。我想重建一个等待图,但没有事件告诉我,获取了一个 由任何线程持有的锁。这是不可能的。

还有其他选择吗? Unix 上的 SIGQUIT 命令允许显示死锁的线程转储,这在 JVMTI 中似乎是不可能的。

【问题讨论】:

    标签: java multithreading deadlock jvmti


    【解决方案1】:

    您应该能够通过 JMX 获取此信息。

    试试

    ManagementFactory.getThreadMXBean().findMonitorDeadlockedThreads();
    

    【讨论】:

    • 是的,但这将使用 java 代理,而不是本地代理。
    • 您可以从本机代码调用 Java 代码。我不明白问题出在哪里。
    • 我不认为原生代理使用字节码,我认为它们是用 C 编写的。
    • 它们是,所以我可以使用 JNI 来调用这里描述的 Java 方法吗? journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementing/…
    • 正确,您可以在 Java 代理中执行的任何操作,都可以在本机代理中执行,反之亦然,使用 JNI。 ;) 一个奇怪的例子是 File.length() 这是一个本地方法,但它做的第一件事是通过 JNI 在 Java 中转换文件名的字符编码。 :P
    猜你喜欢
    • 2012-08-30
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    相关资源
    最近更新 更多