我们可以重现系统部分冻结的情况。我们怀疑这可能是由于锁定问题造成的。
我们如何找出我们的应用程序的每个线程目前在哪里?我们可以使用哪种工具找到发生死锁的位置?
答案 0 :(得分:2)
您可以使用jstack实用程序,它显示java进程的堆栈跟踪。您可以在JDK的bin目录中找到它。请参阅the documentation。
答案 1 :(得分:2)
获取threaddump(jconsole,kill -3 pid等)并使用Samurai进行分析
答案 2 :(得分:1)
您需要对正在运行的进程进行线程转储,以查看当时正在运行的所有线程的堆栈跟踪。
最好以5-10秒的间隔进行多次线程转储,以便比较不同转储中的线程活动。
有多种方法可以获取应用程序的线程转储:
如果您正在运行进程的计算机上使用jstack,
jstack {pid} > threaddump.log
kill -3 {pid}
使用jvisiualvm或jconsole,您可以连接到本地/远程进程并生成threaddump
答案 3 :(得分:1)
答案 4 :(得分:0)
如果要查找导致死锁的线程,可以使用ThreadMXBean。 这是一个很好的例子:
deadlock detection using ThreadMXBean
这里还有一个从oracle haw到jstack的链接。 Jstack它可能对你更有用,因为它会告诉你哪些线程正在等待资源,哪个资源,它还会告诉你哪个线程拥有资源: