查找Java应用程序死锁原因的工具[关闭]

Posted

技术标签:

【中文标题】查找Java应用程序死锁原因的工具[关闭]【英文标题】:Tool to find cause of dead lock in Java application [closed] 【发布时间】:2015-05-22 06:49:06 【问题描述】:

我们可以重现您的系统部分冻结的情况。我们怀疑这可能是由于锁定问题造成的。

我们如何找出应用程序的每个线程当前所在的位置?我们可以使用哪个工具来找到发生死锁的位置?

【问题讨论】:

看看这个***.com/questions/8942658/… 如果是 Web 应用程序,您可以使用浏览器调试工具,否则尝试在您认为可能发生死锁的每个地方添加 cmets 并跟踪它们以找到问题的根源 @BhandariS 听说过 JConsole、JVisualVM 吗?这些工具提供死锁检测。 【参考方案1】:

您可以使用 jstack 实用程序,它显示 Java 进程的堆栈跟踪。您可以在 JDK 的 bin 目录中找到它。见the documentation。

【讨论】:

【参考方案2】:

获取一个threaddump(jconsole、kill -3 pid等)并用Samurai分析它

【讨论】:

【参考方案3】:

您需要对正在运行的进程进行线程转储,以查看当时运行的所有线程的堆栈跟踪。

最好以 5-10 秒的间隔进行多个线程转储,以便您可以比较不同转储中线程的活动。

有多种方法可以获取应用程序的线程转储:

    如果你在运行进程的机器上有 jstack,

    jstack pid > threaddump.log
    

    kill -3 pid

    使用jvisiualvm或jconsole,可以连接本地/远程进程并生成threaddump

【讨论】:

【参考方案4】:

如果你想要有图形显示的东西,你可以使用JProfiler,它的锁定图以红色显示死锁:

它还允许您分析一段时间内的锁定情况。

免责声明:我公司开发JProfiler

【讨论】:

【参考方案5】:

如果要查找导致死锁的线程,可以使用 ThreadMXBean 。 这是一个很好的例子:

deadlock detection using ThreadMXBean

这里还有一个来自 oracle haw 的使用 jstack 的链接。 Jstack 它可能对你更有用,因为它会告诉你哪些线程正在等待资源,它还会告诉你哪个线程持有资源:

oracle docs link

【讨论】:

以上是关于查找Java应用程序死锁原因的工具[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

JAVA死锁排查-性能测试问题排查思路

使用 profiling 工具查找 java 代码中 outOfMemoryError 的确切原因

一次Mutex死锁的原因探究

java 死锁

JAVA程序设计,多线程且避免死锁

Java死锁及死锁的避免