Java一個案例學會使用Java VisualVM
阿新 • • 發佈:2018-12-25
今天自己寫了個死鎖,打算用Visual IVM分析一下,上網找教程,全部都是教你怎麼安裝和簡單介紹,而我,是看不懂裡面寫的火星文才百度的啊,所以,只能自己搗鼓了,最後我發現了一絲蛛絲馬跡,有助於分析死鎖!!!
測試程式碼,不看程式碼可以看註釋
/** * 下面寫了一個死鎖 * 1. thread1鎖了A物件,休眠; * 2. thread2鎖了B物件等待A物件; * 3. thread1醒來,等待B物件 * 4. 大家互相等待,死鎖 */ public class DeadLockDemo { private static String A = "A"; private static String B = "B"; public static void main(String[] args){ new DeadLockDemo().deadLock1111(); } private void deadLock() { Thread t1 = new Thread(new Runnable(){ @Override public void run(){ synchronized (A){ try { System.out.println("sleep start"); Thread.currentThread().sleep(5000); System.out.println("sleep end"); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (B){ System.out.println("thread1 running"); } } } }); Thread t2 = new Thread(new Runnable(){ @Override public void run() { try { Thread.currentThread().sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (B){ synchronized (A){ System.out.println("thread2 running"); } } } }); t1.setName("AAAAAAAAAAAAAAAAA"); t2.setName("BBBBBBBBBBBBBBBBB"); t1.start(); t2.start(); } }
執行結果,然後卡主了,紅點表示程式一直在執行(執行緒在互相等待)
接下來,就到了我們visual IVM出馬了!!
來,我們想象這樣一個場景,現在我們運行了上面這個專案,我們不知道有死鎖可能發生,突然一個使用者反映說,程式卡死不懂了,怎麼辦?(大腦思考:卡死 → 服務停止了 → 死鎖) ,哦,可能專案死鎖了,那我們開啟vimsual ivm看看能否找出一些蛛絲馬跡!!!
開啟ivm,發現一個明顯是自己專案裡的檔名出現,出於好奇點開
點開後,開啟執行緒面板頁,喲,檢測到死鎖了,點開dump
拉到最後,重點分析這部分內容
為了明顯,我在程式碼修改了執行緒的名稱為AAAA..和BBBB..。簡單翻譯上面的內容,發現一個java級別的死鎖,執行緒BBB等待一個被執行緒AAA持有的String物件,執行緒AAA也等待執行緒BBB持有的物件那個,所以互鎖了!!,雖然沒有寫是哪個共享資源被鎖了,但從這份報告我們知道這些資訊:死鎖發生在哪個類(仔細看上圖,第幾行也知道) - 死鎖的數量 - 死鎖鎖了哪個物件(這裡所的是String,所以看上去不起眼,如果所的是Student類的話,一眼就能定位到了吧)
最後,如果大家有更好的死鎖分析工具及教程推薦,歡迎寫在評論區