jstackによるデッドロック検出DeadLock
3108 ワード
まず、デッドロックプログラムを作成します.
eclipseで実行すると、プログラムは絶え間なく待機します.この場合、linuxコマンドラインの下で、デッドロックのステータスを表示できます.
まず、jpsを使用して現在実行されているjavaプロセスを表示します.次のようになります.
jps
8759
9734 testJstack
9751 Jps
jstackコマンドを使用すると、次のようになります.
jstack -l 9734 > deadlock.jstack
vimでdeadlockを開く.jstackファイル、発見内容は以下の通りです.
このように、jstackは確かにデッドロックを検出しているのを見ました.
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コマンドラインの下で、デッドロックのステータスを表示できます.
まず、jpsを使用して現在実行されているjavaプロセスを表示します.次のようになります.
jps
8759
9734 testJstack
9751 Jps
jstackコマンドを使用すると、次のようになります.
jstack -l 9734 > deadlock.jstack
vimでdeadlockを開く.jstackファイル、発見内容は以下の通りです.
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は確かにデッドロックを検出しているのを見ました.