愛上Java診斷利器之Arthas

buildupchao發表於2019-06-07

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包。

愛上Java診斷利器之Arthas

嘗試下arthas:

# 啟動arthas,會進入命令列互動狀態
java -jar arthas-boot.jar

# 檢視arthas命令手冊
java -jar arthas-boot.jar -h

愛上Java診斷利器之Arthas

  • 方式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 基礎命令

愛上Java診斷利器之Arthas

  • 通過dashboard命令可以實時檢視應用監控資料

愛上Java診斷利器之Arthas

  • 通過thread命令檢視應用程式中所有執行緒情況

愛上Java診斷利器之Arthas
其中第一列為執行緒的ID。

  • 通過thread threadId命令檢視指定執行緒狀態資訊
    • 比如我們要檢視執行緒ID為506的執行緒狀態資訊:

    愛上Java診斷利器之Arthas

    • 當然,因為是命令列互動,也是支援管道流式操作:

    愛上Java診斷利器之Arthas

  • 通過watch命令去檢視方法的引數、返回值和異常資訊

  • 通過sc命令檢視類的資訊
    • 通過sc yourFullClassName

    愛上Java診斷利器之Arthas

    • 通過sc -d yourFullClassName*去檢視JVM載入的類資訊

    愛上Java診斷利器之Arthas

    • 通過sc *yourClassName*去檢視JVM載入的類資訊

    愛上Java診斷利器之Arthas

  • 通過sm命令檢視類的方法資訊
    • case 1: sm java.math.RoundingMode

    愛上Java診斷利器之Arthas

    • case 2: sm -d java.math.RoundingMode

    愛上Java診斷利器之Arthas

    • case 3: sm java.math.RoundingMode <init>

    愛上Java診斷利器之Arthas

2.2.2 重頭戲命令

  • 通過jad yourFullClassName去檢視反編譯後的完整程式碼資訊

    愛上Java診斷利器之Arthas

  • 通過jad --source-only yourFullClassName > /tmp/yourClassName.java匯出反編譯程式碼到臨時目錄

    愛上Java診斷利器之Arthas

    愛上Java診斷利器之Arthas

  • 通過vim /tmp/yourClassName.java進行編輯修改程式碼

    愛上Java診斷利器之Arthas

    愛上Java診斷利器之Arthas

  • 通過sc -d *yourClassName | grep classLoaderHash獲取載入yourClassName的類載入器

    愛上Java診斷利器之Arthas

  • 通過mc -c classLoaderHash /tmp/yourClassName.java -d /tmp重新用相同類載入器重新編譯修改後的類(mc: Memory Compiler)

    愛上Java診斷利器之Arthas

    愛上Java診斷利器之Arthas

  • 通過redefine /tmp/yourFullClassName.class重新載入新的被編譯的類檔案

2.2.3 更多操作案例

請參考官方手冊,瞭解更多操作案例和用法。

參考資料

相關文章