java線上診斷神器-Arthas-試用札記
筆者閒逛開源中國,偶遇“開源中國 2018 年度榜單之國產新秀榜”之top1-Arthas,遂觀之。閱後興奮不已,此乃上古神器也。神器流落凡間,豈可枉顧之?盤它。。。
一 Arthas 何許神器?
神器鑄造者如是說:
當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:
這個類從哪個 jar 包載入的?為什麼會報各種類相關的 Exception?
我改的程式碼為什麼沒有執行到?難道是我沒 commit?分支搞錯了?
遇到問題無法在線上 debug,難道只能通過加日誌再重新發布嗎?
線上遇到某個使用者的資料處理有問題,但線上同樣無法 debug,線下無法重現!
是否有一個全域性視角來檢視系統的執行狀況?
有什麼辦法可以監控到JVM的實時執行狀態?
吶尼?如是而言,生產環境的問題豈非暴露無遺?再也不用為了定位生產環境問題而抓耳撓腮?不用再為了加個日誌而打包上線重啟?so crazy!
二 Arthas安裝篇
wget https://alibaba.github.io/arthas/arthas-boot.jar
下載
執行: java -jar arthas-boot.jar
簡單到想哭 有木有。
(ps:如果使用高大上的mac,可以使用homebrew安裝wget後安裝。)
當然想要全量下載安裝也是可以的 arthas下載
三 小試牛刀
3.1啟動arthas:
java -jar arthas-boot.jar

image.png
3.2選擇需要檢視的程序:
2

image.png
3.3當前程序的資訊,按ctrl+c可以中斷執行
dashboard

image.png
可以看到程序裡執行中的執行緒,記憶體、jvm及GC資訊。
四 牛逼閃閃的功能
4.1 jad反編譯指定已載入類的原始碼
命令: thread 1
檢視執行緒資訊,找到類路徑demo.MathGame

image.png
反編譯類: jad demo.MathGame

image.png
jad demo.MathGame main
再也不用為了反編譯程式碼,從伺服器拉下jar包找破解軟體進行反編譯了有沒有。。。
4.2 方法執行資料觀測
watch可以觀察到指定方法的呼叫情況。能觀察到的範圍為:返回值、丟擲異常、入參,通過編寫 OGNL 表示式進行對應變數的檢視。
觀察方法出參和返回值:
watch demo.MathGame primeFactors "{params,returnObj}" -x 2

image.png
4.3 redefine
載入外部的.class檔案,redefine jvm已載入的類
該功能可以使得在不替換jar和重啟的情況下,通過替換需要的class檔案來實現除錯,比如追加日誌。
關於該功能的使用, Arthas實踐--使用redefine排查應用奇怪的日誌來源 的講述頗為直觀,可參考之。
4.5除上述外還有trace命令可以檢視方法內部呼叫路徑,並輸出方法路徑上的每個節點上耗時;sc命令檢視JVM已載入的類資訊等等,諸君可細細把玩,盤它或有受益。