java jstack 死锁_利用jstack检测死锁DeadLock
首先,制造一個死鎖程序如下:
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確實檢測到了一個死鎖。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java jstack 死锁_利用jstack检测死锁DeadLock的全部內容,希望文章能夠幫你解決所遇到的問題。