1. 程式人生 > >Java一個案例學會使用Java VisualVM

Java一個案例學會使用Java VisualVM

今天自己寫了個死鎖,打算用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類的話,一眼就能定位到了吧)

最後,如果大家有更好的死鎖分析工具及教程推薦,歡迎寫在評論區