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

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

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

【问题讨论】:

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

标签: java locking profiling monitoring deadlock


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

        jstack {pid} > threaddump.log
        
      2. kill -3 {pid}

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

      【讨论】:

        【解决方案4】:

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

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

        免责声明:我公司开发JProfiler

        【讨论】:

          【解决方案5】:

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

          deadlock detection using ThreadMXBean

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

          oracle docs link

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-16
            • 2023-03-27
            • 1970-01-01
            • 1970-01-01
            • 2011-12-16
            • 2021-10-03
            • 1970-01-01
            相关资源
            最近更新 更多