1. 程式人生 > >VisualVM(9) 排查JAVA應用程式執行緒死鎖

VisualVM(9) 排查JAVA應用程式執行緒死鎖

Java虛擬機器效能管理神器 - VisualVM(9) 排查JAVA應用程式執行緒鎖

1. JAVA應用程式執行緒鎖原因

這個例子比較極端,一般情況下,出現鎖競爭激烈是比較常見的。

2. 排查JAVA應用程式執行緒鎖

       啟動 VisualVM,在應用程式視窗,選擇對應的JAVA應用,在詳情視窗》執行緒標籤(勾選執行緒視覺化),檢視執行緒生命週期狀態,主要留意執行緒生命週期中紅色部分。

(1)綠色:代表執行狀態。一般屬於正常情況。如果是多執行緒環境,生產者消費者模式下,消費者一直處於執行狀態,說明消費者處理效能低,跟不上生產者的節奏,需要優化對應的程式碼,如果不處理,就可能導致消費者佇列阻塞的現象。對應執行緒的【RUNNABLE】狀態。

(2)藍色:代表執行緒休眠。執行緒中呼叫Thread.sleep()函式的執行緒狀態時,就是藍色。對應執行緒的【TIMED_WAITING】狀態。

(3)黃色:代表執行緒等待。呼叫執行緒的wait()函式就會出現黃色狀態。對應執行緒的【WAITING】狀態。

(4)紅色:程式碼執行緒鎖定。對應執行緒的【BLOCKED】狀態。


3. 分析解決JAVA應用程式執行緒鎖

        發生執行緒鎖的原因有很多,我所遇到比較多的情況是多執行緒同時訪問同一資源,且此資源使用synchronized關鍵字,導致一個執行緒要等另外一個執行緒使用完資源後才能執行。例如再沒有連線池的情況下,同時訪問資料庫介面。這種情況會導致效能的極具下降,解決的方案是增加連線池,或者修改訪問方式。或者將資源粒度細化,類似ConCurrentHashMap中的處理方式,將資源分為多個更小粒度的資源,在更小粒度資源上來處理鎖,就可以解決資源競爭激烈的問題。]

其他文章: