【JVM性能調優】jstack dump日志輸出線程狀態解析


jdk里面定義的線程狀態有:

public enum State {
        NEW,
        RUNNABLE,
        BLOCKED,
        WAITING,
        TIMED_WAITING,
        TERMINATED;
}

 

但是jstack里面輸出的就沒有這么簡潔,問題追蹤變得復雜

 

 

 首先看一下線程狀態輪換圖

 

 

 雖然線程狀態整體分為:NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED,但是這個粒度太粗了,甚至不知道什么導致的WAITING。

(一). 較容易理解的線程狀態引起原因

1. BLOCKED (on object monitor)

2個線程獲取同一個鎖,A線程得到鎖並占有,那么B線程就是此種狀態

 

2. WAITING (on object monitor)、TIMED_WAITING (on object monitor)

線程調用了wait調用了,等待被喚醒。TIMED_WAITING (on object monitor)調用了帶時間的wait方法。

 

3. TIMED_WAITING (parking)、TIMED_WAITING (on object monitor)

線程調用了park方法,TIMED_WAITING (parking)調用了帶時間的park方法

 

4. TIMED_WAITING (sleeping)

線程調用了sleep方法,WAITING是不存在sleeping的,因為sleep方法都帶時間參數

 

(二). 不容易理解的線程狀態引起原因

1. waiting on condition

此種行為,表面線程在等待一個資源,比如http網絡請求阻塞了等,要注意此種現象

 

2. Runnable

此種狀態最容易理解,實踐表面如果線程一直是此種狀態,通過多次jstack如果發現一直處在一個方法上,那也應該是有問題,比如說死循環,網絡請求(有的網絡請求不一定看起來就是阻塞現象,因為它一直在運行)

一般CPU很忙時,則關注runnable的線程,CPU很閑時,則關注waiting for monitor entry的線程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM