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

时间:2015-05-22 06:49:06

标签: java locking profiling monitoring deadlock

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

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

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

获取threaddump(jconsole,kill -3 pid等)并使用Samurai进行分析

答案 2 :(得分:1)

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

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

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

  1. 如果您正在运行进程的计算机上使用jstack,

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

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

答案 3 :(得分:1)

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

enter image description here

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

免责声明:我公司开发JProfiler

答案 4 :(得分:0)

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

deadlock detection using ThreadMXBean

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

oracle docs link