利用jstack檢測死鎖DeadLock

首先,製造一個死鎖程序以下:java

public class testJstack {
 final static Object obj_1 = new Object();
 final static Object obj_2 = new Object();
  public static void main(String[] args){
   
   Thread t1 = new Thread("t1"){
    public void run(){
     synchronized(obj_1){
      try{
       Thread.sleep(3000);
      }catch(InterruptedException e){}
      System.out.println("lock obj_1");
      synchronized(obj_2){
       System.out.println("thread t1 done.");
      }
     }
     
     
    }
   };
   
   Thread t2 = new Thread("t2"){
    public void run(){
     synchronized(obj_2){
      
      System.out.println("lock obj_2");
      synchronized(obj_1){
       System.out.println("thread t2 done.");
      }
      
     }
     
    }
   };
   t1.start();
   t2.start();
  }

 


在eclipse中執行以後,程序就會進入漫無休止的等待。這時,咱們能夠在linux命令行下,查看死鎖的狀態。linux


首先, 利用jps查看當前執行的java進程。以下:vim


jpseclipse

8759 命令行

9734 testJstackcode

9751 Jpsorm


利用jstack命令以下:進程


jstack -l 9734 > deadlock.jstackip


利用vim 打開deadlock.jstack文件,發現內容以下:it

2011-04-28 21:42:40
   java.lang.Thread.State: RUNNABLE
   Locked ownable synchronizers:
        - None
   java.lang.Thread.State: RUNNABLE
   java.lang.Thread.State: BLOCKED (on object monitor)
        at testJstack$2.run(testJstack.java:29)
        - waiting to lock <0x8c087670> (a java.lang.Object)
        - locked <0x8c087678> (a java.lang.Object)
   java.lang.Thread.State: BLOCKED (on object monitor)
        at testJstack$1.run(testJstack.java:15)
   Locked ownable synchronizers:
        - None
   java.lang.Thread.State: RUNNABLE
   Locked ownable synchronizers:
        - None
   java.lang.Thread.State: RUNNABLE
   Locked ownable synchronizers:
   java.lang.Thread.State: RUNNABLE
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - locked <0x8c050b30> (a java.lang.ref.ReferenceQueue$Lock)
   Locked ownable synchronizers:
        - None
        - waiting on <0x8c050a30> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:485)
        - locked <0x8c050a30> (a java.lang.ref.Reference$Lock)
   Locked ownable synchronizers:
"VM Thread" prio=10 tid=0x0807e800 nid=0x260c runnable
JNI global references: 576
Found one Java-level deadlock:
=============================
"t2":
  which is held by "t1"
"t1":
  which is held by "t2"
Java stack information for the threads listed above:
===================================================
"t2":
        at testJstack$2.run(testJstack.java:29)
        - waiting to lock <0x8c087670> (a java.lang.Object)
        - locked <0x8c087678> (a java.lang.Object)
"t1":
        at testJstack$1.run(testJstack.java:15)
        - waiting to lock <0x8c087678> (a java.lang.Object)
        - locked <0x8c087670> (a java.lang.Object)
Found 1 deadlock.

如上,咱們看到jstack確實檢測到了一個死鎖。

相關文章
相關標籤/搜索