`

dump线程让死锁无处可逃

    博客分类:
  • JVM
阅读更多

昨天看到有人问:”一个程序在运行的时候,如何知道它是否发生死锁,如果发生死锁,如何找到发生死锁的位置?“;便贴了一段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.

 
上面的红色部分便也可以清楚查询到死锁的位置了;
 
当然据说第二部分只有java5 以上版本才有的(未验证)。 dump数据见附件
 
 
本站支持 pay for your wishes
3
4
分享到:
评论
1 楼 chenzhou123520 2012-10-13  
楼主分析很细致,感谢分享

相关推荐

    java Thread Dump Lockness检查死锁

    java Thread Dump 其实就是stack trace。 我们平时经常会碰见java异常,并且得到异常的方法用e.printstacktrace 实际上程序正常运行时也是会有stack trace的,只不过平时不显示出来而已。如何能正常及时显示堆栈信息...

    好用的线程dump分析工具

    好用的线程dump分析工具

    JAVA线程dump的分析

    JAVA线程dump的分析 JAVA线程dump是指在JAVA程序中,当前线程的状态和调用堆栈的快照,能够帮助开发者了解当前程序的执行情况,诊断问题和性能瓶颈。生成JAVA线程dump的方法在不同的操作系统下是不同的,在Windows...

    tda分析线程dump的工具

    线程 Dump 分析是 IT 系统性能优化中不可或缺的一部分,尤其在 Java 应用程序中,当系统出现响应慢或者卡死等异常情况时,通过获取和分析线程 Dump 文件,我们可以找出导致问题的线程,定位内存泄漏、死锁等问题。...

    如何通过jstack命令dump线程信息

    在上述示例中,可以修改代码,让所有线程都先尝试获取锁A,然后再获取锁B,这样就不会形成循环等待,从而避免死锁。 总的来说,掌握`jstack`命令的使用对于Java开发人员来说至关重要,它能够帮助我们及时发现并解决...

    java 线程 dump 分析工具 2.3.3

    java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的...

    TDA.ZIP 线程dump分析工具

    线程 Dump 分析是Java应用性能优化和故障排查的关键步骤,尤其在遇到系统无响应、线程死锁或阻塞等问题时。`TDA(ZIP)`,全称为Thread Dump Analyzer,是一个专门用于分析Java线程Dump文件的强大工具,能够帮助开发者...

    Java线程Dump分析工具jstack解析及使用场景

    Java线程Dump分析工具jstack是Java开发人员和运维人员常用的诊断工具,它能够帮助我们了解Java应用程序中线程的状态,以及线程的执行轨迹。本文将深入解析jstack的使用方法及其在不同场景下的应用。 jstack命令的...

    Java线程dump分析脚本

    java线程dump自动分析工具 java线程dump自动分析工具 java线程dump自动分析工具

    JAVA jvm DUMP 内存分析

    性能测试,线程的 dump 看到线程的 死锁,等待 运行状态

    Java解决死锁问题eclipse代码版

    在Java编程中,死锁是多线程环境下常见的问题,当两个或多个线程相互等待对方释放资源,导致它们都无法继续执行时,就会出现死锁。`synchronized`关键字是Java提供的一种内置锁机制,用于控制对共享资源的并发访问,...

    IBM thread dump文件分析工具

    线程dump文件是JVM在特定时刻生成的一种快照,它包含了JVM中所有线程的详细信息,包括线程ID、线程状态、栈轨迹等。IBM Thread and Monitor Dump Analyzer(TMDA,也称作jca)是一个专门用于解析和分析这些线程dump...

    dumpclass dump线程工具

    java -jar dumpclass-0.0.1.jar 19558 com.demo* --classLoaderPrefix

    java线程分析工具TDA

    TDA(Thread Dump Analyzer)是一款强大的Java线程分析工具,它能够帮助开发者深入理解应用在运行时的线程状态,包括线程的阻塞情况、等待资源、死锁等问题。下面将详细介绍TDA的使用方法、功能以及它如何帮助我们...

    java线上故障分析-线程dump,堆内存分析

    线程dump可能显示多个线程处于长时间等待状态,提示存在潜在的死锁或资源争抢问题。而堆内存分析则能揭示是否存在大量未释放的对象,特别是那些长期存活的对象池是否合理。 #### 结论 Java线上故障分析是一项复杂...

    java thread dump 分析

    Thread Dump 的内容包括线程列表、锁信息、死锁信息等。线程列表中包括每个线程的 ID、名称、状态等信息。锁信息中包括锁的类型、锁的所有者、锁的状态等信息。死锁信息中包括死锁的线程 ID、死锁的原因等信息。 ...

    IBM Thread and Monitor Dump Analyzer for Java (jca) 线程分析工具 jca45

    IBM Thread and Monitor Dump Analyzer for Java(简称 jca)。它可以识别Java线程中的挂起,死锁,资源竞争,和瓶颈。 使用方法: java -Xmx1000m -jar jca456.jar

    Thread Dump Analyzer

    线程转储是在特定时间点应用程序中所有线程的状态快照,它包含了每个线程的详细信息,如线程ID、线程状态、堆栈跟踪等,这对于诊断和解决多线程编程中的性能问题和死锁状况至关重要。 当Java应用程序遇到性能瓶颈或...

    TDA-Thread Dump Analyzer - tda-bin-2.3.3.zip

    TDA(Thread Dump Analyzer)是一个专门用于解析和分析Java线程Dump的日志文件的工具,它可以帮助开发者快速定位线程阻塞、死锁等问题,从而优化应用程序的性能。 **一、什么是线程Dump** 线程Dump是Java虚拟机在...

Global site tag (gtag.js) - Google Analytics