Java 線程調優 Jstack & Arthas使用筆記 查找耗時線程

Jstack

  1. 使用jps查找出java進程的pid,如7777
    或 ps -ef | grep java

  2. 使用top -p 7777觀察進程情況,然後Shift+h,顯示該進程的所有線程。

  3. 找出CPU消耗較多的線程id,如7788,將7788轉換爲16進制0x1e6c,注意是小寫。

  4. 使用jstack 7777 | grep -A 10 0x1e6c 來查詢出具體的線程狀態。
    -A 10表示查找到所在行的後10行

Arthas

當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:

  1. 這個類從哪個 jar 包加載的?爲什麼會報各種類相關的 Exception?

  2. 我改的代碼爲什麼沒有執行到?難道是我沒 commit?分支搞錯了?

  3. 遇到問題無法在線上 debug,難道只能通過加日誌再重新發布嗎?

  4. 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!

  5. 是否有一個全局視角來查看系統的運行狀況?

  6. 有什麼辦法可以監控到JVM的實時運行狀態?

使用

wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar

常見指令

  1. dashboard

    實時查看應用監控數據

  2. thread

    查看應用程序中所有線程情況

    thread threadId命令查看指定線程狀態信息
    thread -n {n} 打印最忙的n個線程的信息
    trace

  3. trace 類 方法

    查看每個步驟耗時

  4. stack

    stack 類 方法

    輸出當前方法被調用的調用路徑

  5. watch

    方便的觀察到指定方法的調用情況。能觀察到的範圍爲:返回值、拋出異常、入參,通過編寫 OGNL 表達式進行對應變量的查看。

Ref

  1. Arthas 官方文檔 https://alibaba.github.io/arthas/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章