JAVA死鎖排查-效能測試問題排查思路

老僧觀天下發表於2020-07-05

死鎖原因

Java發生死鎖的根本原因是:在申請鎖時發生了交叉閉環申請。即執行緒在獲得了鎖A並且沒有釋放的情況下去申請鎖B,這時,另一個執行緒已經獲得了鎖B,在釋放鎖B之前又要先獲得鎖A,因此閉環發生,陷入死鎖迴圈。

監控死鎖

VisualVM監控工具有明顯執行緒死鎖提醒,也可監控到發生死鎖的執行緒、類、程式碼行數、資料型別。

分析死鎖

  1. VisualVM生成threaddump,查詢死鎖程式碼塊記憶體地址
  2. VisualVM生成heapdump, 使用OQL檢視被死鎖物件的值和引用
select heap.findObject("0x00000006c0276428")

  1. 使用OQL的另一種方法
jmap -dump:live,file=/data/test.map <jps埠號>
jhat /data/test.map
瀏覽器訪問 http://ip:7000/


示例程式碼

/*
 * 執行緒死鎖等待演示
 */
static class SynAddRunalbe implements Runnable {
    int a, b;

    public SynAddRunalbe(int a, int b) {
        this.a = a;
        this.b = b;
    }
    @Override
    public void run() {
        synchronized (Integer.valueOf(a)) {
            synchronized (Integer.valueOf(b)) {
                System.out.println(a + b);
            }
        }
    }
    
public static void main(String[] args) throws Exception {
    for (int i=0;i< 100; i++) {
        new Thread(new SynAddRunalbe(1, 2)).start();
        new Thread(new SynAddRunalbe(2, 1)).start();
    }
}

掃一掃,關注我

相關文章