當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:
-
這個類從哪個 jar 包加載的?為什么會報各種類相關的 Exception?
-
我改的代碼為什么沒有執行到?難道是我沒 commit?分支搞錯了?
-
遇到問題無法在線上 debug,難道只能通過加日志再重新發布嗎?
-
線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
-
是否有一個全局視角來查看系統的運行狀況?
-
有什么辦法可以監控到JVM的實時運行狀態?
Arthas是Alibaba開源的java在線診斷工具,采用命令行交互模式,可以方便的在線診斷排查、熱修改代碼,侵入小,提供了豐富的功能,是排查jvm相關問題的利器。
下載啟動
下載arthas-boot.jar並拷貝到服務器上,在cmd命令行窗口運行java -jar arthas-boot.jar
來啟動即可,非常的方便。
啟動過程中要注意:需要先配置jre的環境變量才能使用java命令(或者直接進到jre的bin目錄下啟動);一般來說arthas會自動檢測到當前正在運行的java進程讓你選擇進行attach,但是有些情況下會出現讓你輸入pid的現象,這時只需打開任務管理器找到要查看的tomcat進程的pid(可以右鍵打開文件所在的位置來更加准確的判斷哪個是需要分析的tomcat進程)。還有些服務器環境是沒有外網權限的,啟動過程就會出現下載相應jar失敗的問題,有兩種解決辦法,一是在有外網權限的機器上(如開發者自己的機器)在C:\Users\Administrator.arthas將lib包拷貝到服務器同樣的目錄下,或者下載全量的arthas-packaging,里面已經包含啟動arthas所需的jar包。
輸入中括號里里面的數字選擇你想要attach的java進程,后面的1716、8656等是java進程的PID,最后打印下面這樣的信息說明啟動成功。
-
瀏覽器下使用Arthas
Arthas目前支持Web Console,用戶在attach成功之后,可以直接訪問:http://127.0.0.1:8563/
,也可以連接其他服務器上的arthas(注意防火牆)。 -
退出Arthas
如果只是退出當前的連接,可以用quit或者exit命令。Attach到目標進程上的arthas還會繼續運行,端口會保持開放,下次連接時可以直接連接上。如果想完全退出arthas,可以執行shutdown命令。
如果出現以下問題,說明已經attach到另外一個java進程,進入已經連接的進程后執行shutdown退出即可(exit命令只是退出,arthas還在后台運行)。
常用命令
arthas支持的命令十分豐富,具體可以查閱官方文檔,下面是我經常用到的命令。
dashboard
輸入dashboard,會展示當前進程的信息和JVM的內存使用情況,按ctrl+c可以中斷執行。
在排查JVM內存使用和如CPU占用過高這類的問題時很有幫助。
thread
可以查詢展示當前最忙的前N個線程並打印堆棧:
watch
這個是我認為最強大的一個功能,對於排查問題非常的有幫助。
watch能方便的觀察到指定方法的調用情況,可以查看入參的值、類的靜態變量信息和方法返回值等等,對於定位問題非常方便。
如圖,可以查看addOrUpdateWorker方法的入參worker的值。- x 2代表打印結果的遍歷深度,默認是1.