`

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...

    java线程分析工具TDA

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

    dumpclass dump线程工具

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

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

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

    java thread dump 分析

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

    Thread Dump Analyzer

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

    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

    进程死锁查看器

    进程死锁查看器是一款基于Windows的实用工具,它利用了Windows Crash Dump (WCT) API来检测和分析系统的进程死锁情况。死锁是多线程编程中一个严重的问题,当两个或多个进程互相等待对方释放资源而无法继续执行时,...

Global site tag (gtag.js) - Google Analytics