在 Java 应用程序中查找死锁原因的工具
Tool to find cause of dead lock in Java application
我们可以重现您的部分系统死机的情况。我们怀疑这可能是由于锁定问题造成的。
我们如何才能找到应用程序的每个线程当前所在的位置?有什么工具可以找到死锁发生的地方?
如果你想找到导致死锁的线程,你可以使用 ThreadMXBean 。
这是一个很好的例子:
deadlock detection using ThreadMXBean
这里还有一个 link 来自 oracle haw 的使用 jstack。 Jstack 它可能对你更有用,因为它会告诉你哪些线程正在等待资源,哪个资源,它还会告诉你哪个线程持有资源:
您可以使用 jstack 实用程序,它显示 java 进程的堆栈跟踪。您会在 JDK 的 bin 目录中找到它。参见 the documentation。
您需要获取 运行 进程的线程转储,以查看当时所有线程 运行 的堆栈跟踪。
以 5-10 秒的间隔进行多次线程转储是个好主意,这样您就可以比较不同转储中线程的 activity。
有多种获取应用程序线程转储的方法:
如果你在进程为运行,
的机器上有jstack
jstack {pid} > threaddump.log
kill -3 {pid}
使用 jvisiualvm 或 jconsole,您可以连接到 local/remote 进程并生成 threaddump
获取线程转储(jconsole、kill -3 pid 等)并使用 Samurai
进行分析
如果你想要有图形显示的东西,你可以使用JProfiler,它的锁定图形以红色显示死锁:
它还允许您随时间分析锁定情况。
免责声明:我公司开发JProfiler
我们可以重现您的部分系统死机的情况。我们怀疑这可能是由于锁定问题造成的。
我们如何才能找到应用程序的每个线程当前所在的位置?有什么工具可以找到死锁发生的地方?
如果你想找到导致死锁的线程,你可以使用 ThreadMXBean 。 这是一个很好的例子:
deadlock detection using ThreadMXBean
这里还有一个 link 来自 oracle haw 的使用 jstack。 Jstack 它可能对你更有用,因为它会告诉你哪些线程正在等待资源,哪个资源,它还会告诉你哪个线程持有资源:
您可以使用 jstack 实用程序,它显示 java 进程的堆栈跟踪。您会在 JDK 的 bin 目录中找到它。参见 the documentation。
您需要获取 运行 进程的线程转储,以查看当时所有线程 运行 的堆栈跟踪。
以 5-10 秒的间隔进行多次线程转储是个好主意,这样您就可以比较不同转储中线程的 activity。
有多种获取应用程序线程转储的方法:
如果你在进程为运行,
的机器上有jstackjstack {pid} > threaddump.log
kill -3 {pid}
使用 jvisiualvm 或 jconsole,您可以连接到 local/remote 进程并生成 threaddump
获取线程转储(jconsole、kill -3 pid 等)并使用 Samurai
进行分析如果你想要有图形显示的东西,你可以使用JProfiler,它的锁定图形以红色显示死锁:
它还允许您随时间分析锁定情况。
免责声明:我公司开发JProfiler