標籤:rmi AC 堆棧 產生 lock wait nbsp 分享圖片 []
jstack用於生產java虛擬機器當前時刻的線程快照。線程快照是當前java虛擬機器內每一條線程正在執行的方法
堆棧的集合,產生線程快照的主要目的是定位線程出現長時間停頓的原因,比如線程間死結、死迴圈、請求
外部資源導致長時間等待等。線程出現停頓的時候通過jstack命令可查看各個線程的呼叫堆疊
線程狀態
new 未啟動
runnable 在虛擬機器內執行
blocked 阻塞並等待監視器鎖
waiting 無限等待另一個線程執行特定操作
timed_waiting 有時限地等待另一個線程的特定操作
terminated 已退出
jstack使用簡單樣本(死結情況類比)
1 public class DeadLock { 2 3 public static void main(String[] args) { 4 //擷取當前線程pid 5 System.out.println(ManagementFactory.getRuntimeMXBean().getName()); 6 Thread t1 = new Thread(new DeadLockClass(true)); 7 Thread t2 = new Thread(new DeadLockClass(false)); 8 t1.start(); 9 t2.start();10 }11 }12 13 14 class DeadLockClass implements Runnable {15 public boolean flag;16 17 public DeadLockClass(boolean flag) {18 this.flag = flag;19 }20 21 @Override22 public void run() {23 if(flag) {24 while(true) {25 synchronized (SuoObject.obj_1) {26 System.out.println("obj_1" + Thread.currentThread().getName());27 synchronized (SuoObject.obj_2) {28 System.out.println("obj_2" + Thread.currentThread().getName());29 }30 }31 }32 }else {33 while(true) {34 synchronized (SuoObject.obj_2) {35 System.out.println("obj_2" + Thread.currentThread().getName());36 synchronized (SuoObject.obj_1) {37 System.out.println("obj_1" + Thread.currentThread().getName());38 }39 }40 }41 }42 }43 }44 45 class SuoObject {46 static Object obj_1 = new Object();47 static Object obj_2 = new Object();48 }
根據列印出的線程pid, 使用jstack pid命令,即可出現如下如所示結果,死結的資訊一目瞭然!!!
java命令-jstack