如何使用jstack分析執行緒狀態

架構師springboot發表於2018-12-04

背景 記得前段時間,同事說他們測試環境的伺服器cpu使用率一直處於100%,本地又沒有什麼介面呼叫,為什麼會這樣?cpu使用率居高不下,自然是有某些執行緒一直佔用著cpu資源,那又如何檢視佔用cpu較高的執行緒?

如何使用jstack分析執行緒狀態

當然一個正常的程式設計師不會寫出上述程式碼,這裡只是為了讓一個執行緒佔用較高的cpu資源。 top命令 在linux環境下,可以通過top命令檢視各個程式的cpu使用情況,預設按cpu使用率排序

如何使用jstack分析執行緒狀態
1、上圖中可以看出pid為23344的java程式佔用了較多的cpu資源; 2、通過top -Hp 23344可以檢視該程式下各個執行緒的cpu使用情況;

如何使用jstack分析執行緒狀態
上圖中可以看出pid為25077的執行緒佔了較多的cpu資源,利用jstack命令可以繼續檢視該執行緒當前的堆疊狀態。

jstack命令 通過top命令定位到cpu佔用率較高的執行緒之後,繼續使用jstack pid命令檢視當前java程式的堆疊狀態

如何使用jstack分析執行緒狀態
jstack命令生成的thread dump資訊包含了JVM中所有存活的執行緒,為了分析指定執行緒,必須找出對應執行緒的呼叫棧,應該如何找? 在top命令中,已經獲取到了佔用cpu資源較高的執行緒pid,將該pid轉成16進位制的值,在thread dump中每個執行緒都有一個nid,找到對應的nid即可;隔段時間再執行一次stack命令獲取thread dump,區分兩份dump是否有差別,在nid=0x246c的執行緒呼叫棧中,發現該執行緒一直在執行JstackCase類第33行的calculate方法,得到這個資訊,就可以檢查對應的程式碼是否有問題。 通過thread dump分析執行緒狀態 除了上述的分析,大多數情況下會基於thead dump分析當前各個執行緒的執行情況,如是否存在死鎖、是否存在一個執行緒長時間持有鎖不放等等。 在dump中,執行緒一般存在如下幾種狀態: 1、RUNNABLE,執行緒處於執行中 2、BLOCKED,執行緒被阻塞 3、WAITING,執行緒正在等待 例項1:多執行緒競爭synchronized鎖

如何使用jstack分析執行緒狀態
很明顯:執行緒1獲取到鎖,處於RUNNABLE狀態,執行緒2處於BLOCK狀態 1、locked <0x000000076bf62208>說明執行緒1對地址為0x000000076bf62208物件進行了加鎖; 2、waiting to lock <0x000000076bf62208> 說明執行緒2在等待地址為0x000000076bf62208物件上的鎖; 3、waiting for monitor entry [0x000000001e21f000]說明執行緒1是通過synchronized關鍵字進入了監視器的臨界區,並處於"Entry Set"佇列,等待monitor,具體實現可以參考深入分析synchronized的JVM實現; 例項2:通過wait掛起執行緒 static class Task implements Runnable { @Override public void run() { synchronized (lock) { try { lock.wait(); //TimeUnit.SECONDS.sleep(100000); } catch (InterruptedException e) { e.printStackTrace(); } } } }

dump結果

如何使用jstack分析執行緒狀態
執行緒1和2都處於WAITING狀態 1、執行緒1和2都是先locked <0x000000076bf62500>,再waiting on <0x000000076bf62500>,之所以先鎖再等同一個物件,是因為wait方法需要先通過synchronized獲得該地址物件的monitor; 2、waiting on <0x000000076bf62500>說明執行緒執行了wait方法之後,釋放了monitor,進入到"Wait Set"佇列,等待其它執行緒執行地址為0x000000076bf62500物件的notify方法.

感興趣可以加Java架構師群獲取Java工程化、高效能及分散式、高效能、深入淺出。高架構。效能調優、Spring,MyBatis,Netty原始碼分析和大資料等多個知識點高階進階乾貨的直播免費學習許可權 都是大牛帶飛 讓你少走很多的彎路的 群..號是:855801563 對了 小白勿進 最好是有開發經驗

注:加群要求

1、具有工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。

2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。

3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。

4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。

5.阿里Java高階大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!

相關文章