目錄
背景
Arthas是什么?
安裝
使用arthas-boot(推薦)
啟動
常用命令
一鍵生成arthas命令的插件(強烈推薦)
watch
一、命令語法結構
二、核心參數詳解
三、實戰場景
1. 基礎觀測 - 查看入參和返回值
2. 條件過濾 - 只關注特定參數
3. 異常捕獲 - 定位NPE根源
4. 耗時監控 - 組合#cost變量
5. 對象深挖 - 追蹤集合內部數據
6. 鏈式觀測 - 結合OGNL表達式
jad
一、命令語法結構
二、核心參數詳解
三、實戰場景
1. 基礎用法 - 反編譯整個類
2. 過濾方法 - 只反編譯特定方法
3. 源碼對比 - 確認生產環境代碼版本
trace
一、核心功能原理
二、核心參數矩陣
三、實戰場景
1. 基礎耗時分析
2. 條件過濾分析
3. 多層調用鏈路展開
4. 異步線程追蹤
5. 重載方法區分
6. 異常路徑追蹤
背景
通常,本地開發環境無法訪問生產環境。如果在生產環境中遇到問題,則無法使用 IDE 遠程調試。更糟糕的是,在生產環境中調試是不可接受的,因為它會暫停所有線程,導致服務暫停。
開發人員可以嘗試在測試環境或者預發環境中復現生產環境中的問題。但是,某些問題無法在不同的環境中輕松復現,甚至在重新啟動后就消失了。
如果在代碼中添加一些日志以幫助解決問題,您將必須經歷以下階段:測試、預發,然后生產。這種方法效率低下,更糟糕的是,該問題可能無法解決,因為一旦 JVM 重新啟動,它可能無法復現,如上文所述。
Arthas 旨在解決這些問題。開發人員可以在線解決生產問題。無需 JVM 重啟,無需代碼更改。 Arthas 作為觀察者永遠不會暫停正在運行的線程。
Arthas是什么?
阿里巴巴開源的Java診斷工具Arthas(阿爾薩斯)是一款全能的運行時診斷神器,具備三大核心優勢:
- 零侵入:無需重啟應用或修改代碼
- 全維度:支持方法級監控、類加載追蹤、熱修復等
- 可視化:提供命令行交互和Web Console兩種操作方式
Arthas 是一款線上監控診斷產品,通過全局視角實時查看應用 load、內存、gc、線程的狀態信息,并能在不修改應用代碼的情況下,對業務問題進行診斷,包括查看方法調用的出入參、異常,監測方法執行耗時,類加載信息等,大大提升線上問題排查效率。
安裝
使用arthas-boot
(推薦)
下載arthas-boot.jar
curl -O https://arthas.aliyun.com/arthas-boot.jar
啟動
用java -jar
的方式啟動
java -jar arthas-boot.jar
啟動后如圖:
常用命令
一鍵生成arthas命令的插件(強烈推薦)
watch
Arthas的watch
命令是動態觀測方法調用數據的核心工具,能夠實時捕獲方法的入參、返回值、異常信息,是診斷代碼邏輯問題的利器。
一、命令語法結構
watch 類全路徑 方法名 "{觀測表達式}" [條件過濾] [參數選項]
- 觀測表達式:OGNL語法,支持多維度數據組合
- 條件過濾:
'#cost>50'
(耗時>50ms才觸發) - 參數選項:控制觀測行為(
-b
/-e
/-x
等)
二、核心參數詳解
參數 | 作用 | 示例 |
| 觀察方法調用前(Before)的狀態 |
|
| 觀察方法異常時(Exception)的堆棧 |
|
| 觀察方法返回后(Success)的結果 |
|
| 指定對象展開層級(默認1層) |
(深入3層) |
| 最大捕獲次數(避免無限輸出) |
(只顯示5次) |
三、實戰場景
1. 基礎觀測 - 查看入參和返回值
watch com.example.UserService getUserById "{params,returnObj}" -x 2
👉 輸出示例:
@ArrayList[@Object[][@Long[12345], // 參數1: userId=12345],@User{ // 返回值id=12345,name="張三",age=30}
]
2. 條件過濾 - 只關注特定參數
watch *OrderService createOrder 'params[0] > 1000' 'params[0].amount > 1000' -x 3
👉 當訂單金額amount
超過1000時觸發觀測
3. 異常捕獲 - 定位NPE根源
watch com.example.DataParser parse "{params,throwExp}" -e -x 2
👉 輸出異常堆棧:
throwExp : java.lang.NullPointerException: Cannot read field "id"at com.example.DataParser.parse(DataParser.java:23)...
4. 耗時監控 - 組合#cost
變量
watch com.alibaba.dubbo.Provider invoke '#cost > 200' -n 3
👉 只顯示執行耗時超過200ms的調用,最多捕獲3次
5. 對象深挖 - 追蹤集合內部數據
watch *UserDAO batchInsert '{params[0].![name], returnObj.size}" -x 4
👉 觀測傳入的用戶名列表和插入后的記錄數
👉 ![name]
表示遍歷集合獲取name屬性
6. 鏈式觀測 - 結合OGNL表達式
watch *ConfigLoader load "{ #map={ 'key1':params[0], 'result':returnObj } }" -x 3
👉 自定義數據結構,將入參和返回值封裝成Map輸出
jad
Arthas的jad
命令是實時反編譯JVM加載類的利器,能快速查看內存中的字節碼對應的Java源碼,是排查類沖突、驗證代碼版本的必備工具。
一、命令語法結構
jad [--source-only] 類全路徑 [方法名]
- 內存級反編譯:直接讀取JVM中的Class字節碼
- 無需源碼:即使生產環境沒有源代碼也能查看邏輯
- 動態驗證:檢查熱更新后的代碼是否生效
- 支持過濾:可指定反編譯單個方法
二、核心參數詳解
參數 | 作用 | 使用場景 |
| 僅顯示Java源碼(去除類加載信息) | 快速查看核心邏輯 |
| 顯示行號(需LocalVariableTable存在) | 定位異常堆棧具體行 |
| 反編譯指定方法 | 過濾復雜類的大方法 |
| 指定ClassLoader進行反編譯 | 多ClassLoader環境精準定位 |
三、實戰場景
1. 基礎用法 - 反編譯整個類
jad com.example.UserService# 輸出示例
ClassLoader: jdk.internal.loader.ClassLoaders$AppClassLoader@2c13b15
Location: file:/app.jarpublic class UserService {public User getUserById(Long id) {return userDao.query(id);}...
}
2. 過濾方法 - 只反編譯特定方法
jad com.example.ConfigLoader loadConfig# 輸出指定方法的反編譯結果
3. 源碼對比 - 確認生產環境代碼版本
jad --source-only com.alibaba.dubbo.config.ProtocolConfig# 對比本地代碼,檢查是否有熱修復或不同版本
trace
Arthas的trace
命令是方法調用鏈路追蹤神器,專門用于分析代碼執行路徑中各子調用的耗時分布,快速定位性能瓶頸。以下從核心原理到高階用法全面解析:
一、核心功能原理
trace [選項] 類全路徑 方法名 [條件表達式]
- 火焰圖式分析:展示方法內部調用鏈的樹狀結構
- 耗時統計:精確到每個子調用的耗時占比
- 智能過濾:通過條件表達式篩選需要監控的調用
- 動態插樁:基于字節碼增強技術實現無侵入分析
二、核心參數矩陣
參數 | 作用 | 示例 |
| 最多監控次數(防刷屏) |
(只顯示5次結果) |
| 耗時過濾條件(單位ms) |
|
| 跳過JDK原生方法調用 |
|
| 正則匹配增強(類+方法) |
|
| 顯示可追蹤的類列表 | 配合 使用 |
三、實戰場景
1. 基礎耗時分析
trace com.example.OrderService createOrder
👉 輸出示例:
java復制
+---+--------+--------------+---------+-------+------+
|# |耗時占比 | 調用方法 | 調用次數 | 總耗時 | 平均 |
+---+--------+--------------+---------+-------+------+
|1 | 45.3% | UserDAO.query | 3 | 340ms | 113ms|
|2 | 32.1% | Redis.set | 5 | 241ms | 48ms |
2. 條件過濾分析
trace *UserService getUserById '#cost > 50' -n 3
👉 只顯示單次調用總耗時超過50ms的請求,最多捕獲3次
3. 多層調用鏈路展開
trace -E com.example.*Controller.* -j 3
👉 監控所有Controller類方法,展開3層調用深度
4. 異步線程追蹤
trace --skipJDK=false java.util.concurrent.FutureTask get
👉 追蹤線程池異步任務執行情況(需關閉JDK跳過)
5. 重載方法區分
trace com.example.Utils 'parse' params.length==2
👉 只監控有兩個參數的parse重載方法
6. 異常路徑追蹤
trace com.example.PaymentService pay 'throwExp!=null'
👉 僅捕獲出現異常的支付調用路徑