愛上Java診斷利器之Arthas
1. Arthas是什麼?
摘自Arthas的Github介紹:
Arthas is a Java Diagnostic tool open sourced by Alibaba.
Arthas allows developers to troubleshoot production issues for Java applications without modifying code or restarting servers.
大意為:Arthas是阿里開源的一個Java診斷工具,可以幫助開發人員在不修改程式碼或重啟伺服器的情況下快速定位線上問題。
聽起來確實是我們的程式設計師的一大福利。比如,我們就遇到一種情況,Spring Boot應用中有個cron定時任務為每天凌晨1點啟動執行,但是測試起來很不方便,總不能每次修改cron時間來讓QC測試吧?這樣雖然是方便了測試妹子,但是卻徒增了我們開發時間和迭代次數啊!!!那Arthas到底是否能夠滿足我們需求呢?Go on...
2. 開啟Arthas之旅
2.1 安裝Arthas
- 方式1:下載arthas-boot.jar包的方式
wget https://alibaba.github.io/arthas/arthas-boot.jar
此時在你當前所在目錄下會有個arthas-boot.jar
包。
嘗試下arthas:
# 啟動arthas,會進入命令列互動狀態
java -jar arthas-boot.jar
# 檢視arthas命令手冊
java -jar arthas-boot.jar -h
- 方式2:通過as.sh安裝Arthas(強烈推薦)
# 該命令會下載 as.sh 到當前目錄下 curl -L https://alibaba.github.io/arthas/install.sh | sh
嘗試下arthas:
# 啟動arthas,會進入命令列互動狀態
./as.sh
# 檢視arthas命令手冊
./as.sh -h
2.2 開始使用
下面演示我們以as.sh
為主。
首先我們啟動arthas,會檢視到我們當前server上部署的應用已經被探測到,當前我的server上只有一個應用程式,只需輸入數字1,即可和該應用進行互動:
2.2.1 基礎命令
- 通過
dashboard
命令可以實時檢視應用監控資料
- 通過
thread
命令檢視應用程式中所有執行緒情況
其中第一列為執行緒的ID。
- 通過
thread threadId
命令檢視指定執行緒狀態資訊- 比如我們要檢視執行緒ID為506的執行緒狀態資訊:
- 當然,因為是命令列互動,也是支援管道流式操作:
通過
watch
命令去檢視方法的引數、返回值和異常資訊- 通過
sc
命令檢視類的資訊- 通過
sc yourFullClassName
- 通過
sc -d yourFullClassName*
去檢視JVM載入的類資訊
- 通過
sc *yourClassName*
去檢視JVM載入的類資訊
- 通過
- 通過
sm
命令檢視類的方法資訊- case 1:
sm java.math.RoundingMode
- case 2:
sm -d java.math.RoundingMode
- case 3:
sm java.math.RoundingMode <init>
- case 1:
2.2.2 重頭戲命令
通過
jad yourFullClassName
去檢視反編譯後的完整程式碼資訊通過
jad --source-only yourFullClassName > /tmp/yourClassName.java
匯出反編譯程式碼到臨時目錄通過
vim /tmp/yourClassName.java
進行編輯修改程式碼通過
sc -d *yourClassName | grep classLoaderHash
獲取載入yourClassName的類載入器通過
mc -c classLoaderHash /tmp/yourClassName.java -d /tmp
重新用相同類載入器重新編譯修改後的類(mc: Memory Compiler)通過
redefine /tmp/yourFullClassName.class
重新載入新的被編譯的類檔案
2.2.3 更多操作案例
請參考官方手冊,瞭解更多操作案例和用法。
參考資料
- Arthas
- Arthas使用手冊