在 Java 应用程序中查找死锁原因的工具

Tool to find cause of dead lock in Java application

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

我们如何才能找到应用程序的每个线程当前所在的位置?有什么工具可以找到死锁发生的地方?

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

deadlock detection using ThreadMXBean

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

oracle docs link

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

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

以 5-10 秒的间隔进行多次线程转储是个好主意,这样您就可以比较不同转储中线程的 activity。

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

  1. 如果你在进程为运行,

    的机器上有jstack
    jstack {pid} > threaddump.log
    
  2. kill -3 {pid}

  3. 使用 jvisiualvm 或 jconsole,您可以连接到 local/remote 进程并生成 threaddump

获取线程转储(jconsole、kill -3 pid 等)并使用 Samurai

进行分析

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

它还允许您随时间分析锁定情况。

免责声明:我公司开发JProfiler