查找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应用程序死锁原因的工具[关闭]的主要内容,如果未能解决你的问题,请参考以下文章