是什麼
Arthas
是Alibaba開源的Java診斷工具,深受開發者喜愛。線上排查問題,無需重新開機;動态跟蹤Java代碼;實時監控JVM狀态。可以解決如下常見問題:
- 這個類從哪個 jar 包加載的?為什麼會報各種類相關的 Exception?
- 我改的代碼為什麼沒有執行到?難道是我沒 commit?分支搞錯了?
- 遇到問題無法線上上 debug,難道隻能通過加日志再重新釋出嗎?
- 線上遇到某個使用者的資料處理有問題,但線上同樣無法 debug,線下無法重制!
- 是否有一個全局視角來檢視系統的運作狀況?
- 有什麼辦法可以監控到JVM的實時運作狀态?
- 怎麼快速定位應用的熱點,生成火焰圖?
- 怎樣直接從JVM内查找某個類的執行個體?
安裝以及開始使用
https://arthas.aliyun.com/doc/quick-start.html
常見指令以及使用
https://arthas.aliyun.com/doc/commands.html
問題場景解決
-
方法内部調用路徑,并輸出方法路徑上的每個節點上耗時 trace xx類.xx方法 run
$ trace demo.MathGame run Press Ctrl+C to abort. Affect(class-cnt:1 , method-cnt:1) cost in 42 ms. `---ts=2018-12-04 00:44:17;thread_name=main;id=1;is_daemon=false;priority=5;[email protected] `---[10.611029ms] demo.MathGame:run() +---[0.05638ms] java.util.Random:nextInt() +---[10.036885ms] demo.MathGame:primeFactors() `---[0.170316ms] demo.MathGame:print() 過濾掉jdk的函數 trace -j demo.MathGame run 調用耗時過濾 trace demo.MathGame run '#cost > 10'
- watch 檢視方法入參,出參資訊。stack 檢視方法的調用路徑。tt 指令可以記錄列印出某方法的執行詳情,并觀察不同時間,不同入參的執行情況。【大多是線下無法重制問題,而線上又不能有debug環境時】
- 使用 dashboard 指令可以概覽程式的 線程、記憶體、GC、運作環境資訊。
- 使用 thread檢視所有線程資訊,同時會列出每個線程的
使用率,可以看到圖裡 ID 為12 的線程 CPU 使用100%。CPU
- 如果隻是為了尋找 CPU 使用較高的線程,可以直接使用指令 thread -n [顯示的線程個數] ,就可以排列出 CPU 使用率 Top N 的線程。