昨天看到有人问:”一个程序在运行的时候,如何知道它是否发生死锁,如果发生死锁,如何找到发生死锁的位置?“;便贴了一段dump线程的数据,今天又有人问我怎么从dump文件中分析死锁,随做此文:
1、首先构造死锁,代码如下:
public class Deadlocker { private static Object lock_1 = new int[1]; private static Object lock_2 = new int[1]; public class Thread1 extends Thread { @Override public void run() { System.out.println("thread 1 start"); synchronized (lock_1) { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("thread 1 get lock 1 need lock 2"); synchronized (lock_2) { } } System.out.println("thread 1 end"); } } public class Thread2 extends Thread { @Override public void run() { System.out.println("thread 2 start"); synchronized (lock_2) { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("thread 2 get lock 2 need lock 1"); synchronized (lock_1) { } } System.out.println("thread 2 end"); } } public static void main(String[] args) { Thread1 thread1 = new Deadlocker().new Thread1(); Thread2 thread2 = new Deadlocker().new Thread2(); thread1.start(); thread2.start(); } }
2、运行结果如下:
thread 1 start
thread 2 start
thread 1 get lock 1 need lock 2
thread 2 get lock 2 need lock 1
3、分析:
从打印的结果很容易分析线程1 和线程2 处于死锁。相互需要对方的持有的锁;
4、使用:jps 查看线程id,再使用:jstack 线程id > dumpthread 命令。部分结果如下(去除各种gc线程。。。):
第一部分:
"Thread-1" prio=10 tid=0x0000000040a49800 nid=0x2d1e waiting for monitor entry [0x00007f50eda98000]
java.lang.Thread.State: BLOCKED (on object monitor)
at Deadlocker$Thread2.run(Deadlocker.java:47)
- waiting to lock <0x00000007d6f97ec8> (a [I)
- locked <0x00000007d6f97ee0> (a [I)
"Thread-0" prio=10 tid=0x0000000040a47800 nid=0x2d1d waiting for monitor entry [0x00007f50edb99000]
java.lang.Thread.State: BLOCKED (on object monitor)
at Deadlocker$Thread1.run(Deadlocker.java:28)
- waiting to lock <0x00000007d6f97ee0> (a [I)
- locked <0x00000007d6f97ec8> (a [I)
。。。。。各种其他线程
这里可以看出两个线程处于BLOCKED 状态,各自在等待各自的锁( 0x00000007d6f97ec8 和0x00000007d6f97ee0 )
第二部分:
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x0000000040a33dd8 (object 0x00000007d6f97ec8, a [I),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x0000000040a365e0 (object 0x00000007d6f97ee0, a [I),
which is held by "Thread-1"
这个一看就更明白了。。说发现一个java死锁,Thread-1在等待一个lock,而这个锁被Thread-0 持有,
而 Thread-0在等待另外一个lock,而这个锁被Thread-1 持有
Java stack information for the threads listed above:
===================================================
"Thread-1":
at Deadlocker$Thread2.run(Deadlocker.java:47)
- waiting to lock <0x00000007d6f97ec8> (a [I)
- locked <0x00000007d6f97ee0> (a [I)
"Thread-0":
at Deadlocker$Thread1.run(Deadlocker.java:28)
- waiting to lock <0x00000007d6f97ee0> (a [I)
- locked <0x00000007d6f97ec8> (a [I)
Found 1 deadlock.
相关推荐
java Thread Dump 其实就是stack trace。 我们平时经常会碰见java异常,并且得到异常的方法用e.printstacktrace 实际上程序正常运行时也是会有stack trace的,只不过平时不显示出来而已。如何能正常及时显示堆栈信息...
好用的线程dump分析工具
JAVA线程dump的分析 JAVA线程dump是指在JAVA程序中,当前线程的状态和调用堆栈的快照,能够帮助开发者了解当前程序的执行情况,诊断问题和性能瓶颈。生成JAVA线程dump的方法在不同的操作系统下是不同的,在Windows...
线程 Dump 分析是 IT 系统性能优化中不可或缺的一部分,尤其在 Java 应用程序中,当系统出现响应慢或者卡死等异常情况时,通过获取和分析线程 Dump 文件,我们可以找出导致问题的线程,定位内存泄漏、死锁等问题。...
在上述示例中,可以修改代码,让所有线程都先尝试获取锁A,然后再获取锁B,这样就不会形成循环等待,从而避免死锁。 总的来说,掌握`jstack`命令的使用对于Java开发人员来说至关重要,它能够帮助我们及时发现并解决...
java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的...
线程 Dump 分析是Java应用性能优化和故障排查的关键步骤,尤其在遇到系统无响应、线程死锁或阻塞等问题时。`TDA(ZIP)`,全称为Thread Dump Analyzer,是一个专门用于分析Java线程Dump文件的强大工具,能够帮助开发者...
Java线程Dump分析工具jstack是Java开发人员和运维人员常用的诊断工具,它能够帮助我们了解Java应用程序中线程的状态,以及线程的执行轨迹。本文将深入解析jstack的使用方法及其在不同场景下的应用。 jstack命令的...
java线程dump自动分析工具 java线程dump自动分析工具 java线程dump自动分析工具
性能测试,线程的 dump 看到线程的 死锁,等待 运行状态
在Java编程中,死锁是多线程环境下常见的问题,当两个或多个线程相互等待对方释放资源,导致它们都无法继续执行时,就会出现死锁。`synchronized`关键字是Java提供的一种内置锁机制,用于控制对共享资源的并发访问,...
线程dump文件是JVM在特定时刻生成的一种快照,它包含了JVM中所有线程的详细信息,包括线程ID、线程状态、栈轨迹等。IBM Thread and Monitor Dump Analyzer(TMDA,也称作jca)是一个专门用于解析和分析这些线程dump...
TDA(Thread Dump Analyzer)是一款强大的Java线程分析工具,它能够帮助开发者深入理解应用在运行时的线程状态,包括线程的阻塞情况、等待资源、死锁等问题。下面将详细介绍TDA的使用方法、功能以及它如何帮助我们...
java -jar dumpclass-0.0.1.jar 19558 com.demo* --classLoaderPrefix
线程dump可能显示多个线程处于长时间等待状态,提示存在潜在的死锁或资源争抢问题。而堆内存分析则能揭示是否存在大量未释放的对象,特别是那些长期存活的对象池是否合理。 #### 结论 Java线上故障分析是一项复杂...
Thread Dump 的内容包括线程列表、锁信息、死锁信息等。线程列表中包括每个线程的 ID、名称、状态等信息。锁信息中包括锁的类型、锁的所有者、锁的状态等信息。死锁信息中包括死锁的线程 ID、死锁的原因等信息。 ...
线程转储是在特定时间点应用程序中所有线程的状态快照,它包含了每个线程的详细信息,如线程ID、线程状态、堆栈跟踪等,这对于诊断和解决多线程编程中的性能问题和死锁状况至关重要。 当Java应用程序遇到性能瓶颈或...
IBM Thread and Monitor Dump Analyzer for Java(简称 jca)。它可以识别Java线程中的挂起,死锁,资源竞争,和瓶颈。 使用方法: java -Xmx1000m -jar jca456.jar
进程死锁查看器是一款基于Windows的实用工具,它利用了Windows Crash Dump (WCT) API来检测和分析系统的进程死锁情况。死锁是多线程编程中一个严重的问题,当两个或多个进程互相等待对方释放资源而无法继续执行时,...