參考博客:https://www.jianshu.com/p/213710fb9e40
jstack(Stack Trace for Java)命令用于生成虛擬機當前時刻的線程快照(一般稱為threaddump或者javacore文件)。線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧 的集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因,
如線程間死鎖、死循環、請求外部資源導致的長時間等待等都是導致線程長時間停頓的常見原因。
線程出現停頓的時候通過jstack來查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在后臺做些什么事情,或者等待著什么資源
首先jps -l 查看java進程:
接著再用jstack 21028 查看線程狀態
發現診斷到了死鎖:
?
死鎖演示代碼如下
public class DeadLockTest {/***線程死鎖等待演示*/static class SynAddRunalbe implements Runnable{int a,b;public SynAddRunalbe(int a,int b){this.a=a;this.b=b;}@Overridepublic void run(){synchronized(Integer.valueOf(a)){synchronized(Integer.valueOf(b)){System.out.println(a+b);}}}}public static void main(String[]args){for(int i=0;i<100;i++){new Thread(new SynAddRunalbe(1,2)).start();new Thread(new SynAddRunalbe(2,1)).start();}}
}
?