一、Arthas 是什么?
Arthas(阿爾薩斯)是阿里巴巴開源的一款 Java 在線診斷工具,基于 Java Agent 和字節碼增強技術實現。它無需重啟 JVM,即可動態追蹤代碼執行、實時查看 JVM 狀態、修改代碼邏輯,是生產環境問題排查的“瑞士軍刀”。
核心特點:
-
無侵入:無需修改代碼或重啟應用。
-
動態追蹤:實時監控方法調用、參數、返回值。
-
熱修復:直接修改運行時代碼(慎用)。
全平臺支持:支持 Linux/Windows/macOS,兼容 JDK 6+。
二、 Arthas(阿爾薩斯)能為你做什么?
Arthas 是 Alibaba 開源的 Java 診斷工具,深受開發者喜愛。
當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:
- 這個類從哪個 jar 包加載的?為什么會報各種類相關的 Exception?
- 我改的代碼為什么沒有執行到?難道是我沒 commit?分支搞錯了?
- 遇到問題無法在線上 debug,難道只能通過加日志再重新發布嗎?
- 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
- 是否有一個全局視角來查看系統的運行狀況?
- 有什么辦法可以監控到 JVM 的實時運行狀態?
- 怎么快速定位應用的熱點,生成火焰圖?
- 怎樣直接從 JVM 內查找某個類的實例?
Arthas 支持 JDK 6+(4.x 版本不再支持 JDK 6 和 JDK 7),支持 Linux/Mac/Windows,采用命令行交互模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。
三、安裝與啟動
- 快速安裝
# 下載最新版本
curl -O https://arthas.aliyun.com/arthas-boot.jar
- 啟動并附加到目標 JVM
java -jar arthas-boot.jar
啟動后,Arthas 會列出所有 Java 進程,輸入序號選擇要診斷的進程。
- 退出 Arthas
- 輸入 stop:關閉當前連接。
- 輸入 quit:退出客戶端(不關閉 Arthas 服務端)。
四、核心命令詳解
- 基礎命令
命令 | 作用 |
---|---|
help | 查看所有命令幫助 |
dashboard | 實時監控 JVM 狀態(CPU、內存、線程) |
version | 顯示 Arthas 版本 |
history | 查看命令歷史記錄 |
示例:
# 實時監控 JVM 儀表盤(類似 top)
dashboard
- 類/方法診斷
命令 | 作用 |
---|---|
sc (Search Class) | 查找已加載的類信息 |
sm (Search Method) | 查看類的方法詳情 |
jad | 反編譯指定類的字節碼 |
redefine | 熱替換類(需提前編譯好.class 文件) |
示例:
# 反編譯 com.example.MyService 類
jad com.example.MyService# 熱替換類(替換后立即生效)
redefine /path/to/MyService.class
- 方法調用追蹤
命令 | 作用 |
---|---|
watch | 觀察方法入參、返回值、異常 |
trace | 追蹤方法內部調用鏈路及耗時 |
stack | 查看方法被調用的調用棧 |
monitor | 統計方法調用次數、成功率、平均耗時 |
示例:
# 監控方法入參和返回值(-n 表示監控次數,-x 表示展開層級)
watch com.example.MyService doSomething "{params, returnObj}" -n 5 -x 3# 追蹤方法內部調用鏈路及耗時(耗時單位 ms)
trace com.example.MyService processOrder -n 3
- 線程/堆內存分析
命令 | 作用 |
---|---|
thread | 查看線程狀態、CPU 占用、阻塞點 |
heapdump | 生成堆轉儲文件(類似 jmap -dump) |
vmtool | 直接操作 JVM 對象(查詢/修改字段值) |
示例:
# 查找 CPU 占用最高的線程
thread -n 3# 生成堆轉儲文件到指定路徑
heapdump --live /tmp/heap.hprof
- 高級功能
命令 | 作用 |
---|---|
ognl | 執行任意 OGNL 表達式(調用靜態方法等) |
profiler | 生成火焰圖(需配合 async-profiler) |
logger | 動態修改日志級別(如臨時開啟 DEBUG 日志) |
示例:
# 調用靜態方法獲取系統屬性
ognl '@java.lang.System@getProperty("user.dir")'# 動態調整日志級別為 DEBUG
logger --name ROOT --level debug
五、實戰案例
案例 1:定位接口超時問題
# 1. 追蹤方法調用鏈路及耗時
trace com.example.OrderController createOrder# 2. 觀察某個方法的參數和返回值
watch com.example.UserService getUserById "{params, returnObj}" -x 3# 3. 發現某個 SQL 查詢慢,臨時打印執行的 SQL 日志
logger --name org.hibernate.SQL --level DEBUG
案例 2:緊急修復空指針異常
# 1. 反編譯問題類
jad --source-only com.example.BugService > BugService.java# 2. 本地編輯代碼,添加空指針判斷,重新編譯
javac BugService.java# 3. 熱替換類(立即生效)
redefine /path/to/BugService.class
六、Arthas IDEA插件
Arthas的命令太多了,推薦一款插件
在 IDEA 的插件市場搜索 arthas idea,點擊 Install, 重啟 IDEA 生效
- 優點
1?. 生成Arthas命令?:IDEA插件可以自動生成Arthas命令,方便用戶使用。雖然一些基礎命令如thread、jvm、dashboard等建議用戶手動輸入以加快操作速度?
2.? 性能分析?:使用trace命令選擇項目中的方法進行鏈路跟蹤,粘貼到控制臺監聽調用接口,觀察結果以定位問題方法或數據庫查詢?
- 基礎使用教程
生成 Arthas 命令
操作步驟:
在代碼編輯器中,右鍵點擊 類名 或 方法名。選擇 Arthas Command → 選擇需要的命令(如 watch、trace)。自動生成命令并復制到剪貼板,粘貼到 Arthas 控制臺執行。
示例:生成 trace 命令
右鍵點擊目標方法(如 UserService.getUserById())。選擇 Arthas Command → trace method。生成命令:trace com.example.UserService getUserById -n 5 -v。粘貼到 Arthas 控制臺,觀察方法內部調用鏈路及耗時。
七、Arthas 優缺點
-
優點
零成本接入:無需重啟應用,生產環境友好。功能全面:覆蓋診斷、監控、熱修復全場景。
動態性:實時修改代碼邏輯或日志級別。
社區活躍:阿里巴巴持續維護,文檔豐富。
-
缺點
學習曲線:需熟悉大量命令和參數。安全風險:熱替換可能引發不穩定(需嚴格測試)。
性能開銷:高頻追蹤方法可能增加 CPU 負載。
八、最佳實踐
-
生產環境慎用寫操作:優先使用 watch/trace 等只讀命令。
-
限制監控范圍:避免全量監控(使用 -n 限制監控次數)。
-
結合日志分析:先用 Arthas 定位問題范圍,再通過日志深挖。
-
火焰圖分析:對性能問題使用 profiler 生成火焰圖。
-
權限管控:禁止非授權人員訪問生產環境 Arthas。
九、與其他工具對比
工具 | 優勢 | 局限性 |
---|---|---|
jstack | 輕量級線程快照 | 只能手動觸發,無持續監控 |
JProfiler | 可視化性能分析 | 需安裝客戶端,付費 |
Arthas | 動態追蹤、熱修復、無需重啟 | 命令行操作,學習成本較高 |
十、總結
Arthas 是 Java 開發者診斷線上問題的終極工具,尤其擅長:
-
實時方法級追蹤:無需加日志即可觀察代碼執行細節。
-
動態熱修復:緊急修復線上問題(最后手段)。
-
低開銷監控:替代部分 jmap/jstack 功能。
學習資源:
-
官方文檔:https://arthas.aliyun.com/doc/
-
GitHub 倉庫:https://github.com/alibaba/arthas