阿里重磅開源性能測試神器,性能監控分析工具 Arthas
Arthas(阿爾薩斯)是Alibaba開源的Java診斷性能監控分析工具,它不需要做任何的參數配置,就可以直觀的獲取各種維度的性能數據。通過閱讀官網的介紹,可以看到,當我們遇到以下類似問題而束手無策時,Arthas可以幫助我們解決:
- 這個類從哪個 jar 包加載的?為什么會報各種類相關的 Exception?
- 我改的代碼為什么沒有執行到?難道是我沒 commit?分支搞錯了?
- 遇到問題無法在線上 debug,難道只能通過加日志再重新發布嗎?
- 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
- 是否有一個全局視角來查看系統的運行狀況?
- 有什么辦法可以監控到JVM的實時運行狀態?
Arthas支持JDK 6+,支持Linux/Mac/Winodws,采用命令行交互模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。
安裝
使用arthas-boot推薦安裝方式,下載arthas-boot.jar,然后用java -jar的方式啟動:
獲取arthas
- 在線獲取
- wget https://alibaba.github.io/arthas/arthas-boot.jar
- 離線獲取
- https://alibaba.github.io/arthas/arthas-boot.jar
- 如果下載速度比較慢,可以使用aliyun的鏡像:
- java -jar arthas-boot.jar --repo-mirror aliyun --use-http
- 如果從github下載有問題,可以使用gitee鏡像
- wget https://arthas.gitee.io/arthas-boot.jar
啟動arthas
- java -jar arthas-boot.jar

查看幫助信息
- java -jar arthas-boot.jar -h

***次使用arthas時,會自動下載一些依賴包,等待下載完成,就會進入到arthas提供的命令行界面。

dashboard 實時監控數據
dashboard命令可以查看當前系統的實時數據面板。

圖表說明
- ID:Java級別的線程ID,注意這個ID不能跟jstack中的nativeID一一對應
- NAME:線程名
- GROUP:線程組名
- PRIORITY: 線程優先級, 1~10之間的數字,越大表示優先級越高
- STATE:線程的狀態
- CPU:線程消耗的cpu占比,采樣100ms,將所有線程在這100ms內的cpu使用量求和,再算出每個線程的cpu使用占比。
- TIME:線程運行總時間,數據格式為分:秒
- INTERRUPTED:線程當前的中斷位狀態
- DAEMON: 是否是daemon線程
輸入 Q 或者 Ctrl+C 可以退出dashboard命令。
Thread 查看線程的棧
查看當前線程信息,查看線程的堆棧,thread 1 命令會打印線程ID 1的棧。

同樣,Arthas支持管道,可以用 thread 1 | grep 'main(' 查找到main class。如下,可以看到main class是demo.MathGame。

參數說明
- id:線程id
- [n:]:指定最忙的前N個線程并打印堆棧
- [b]:找出當前阻塞其他線程的線程
- [i <value>]:指定cpu占比統計的采樣間隔,單位為毫秒
Sc(Search-Class)
查看JVM已加載的類信息,搜索出所有已經加載到 JVM 中的 Class 信息。
- sc -d *MathGame

參數說明
- class-pattern:類名表達式匹配
- method-pattern:方法名表達式匹配
- [d]:輸出當前類的詳細信息,包括這個類所加載的原始文件來源、類的聲明、加載的ClassLoader等詳細信息。如果一個類被多個ClassLoader所加載,則會出現多次
- [E]:開啟正則表達式匹配,默認為通配符匹配
- [f]:輸出當前類的成員變量信息(需要配合參數-d一起使用)
- [x:]:指定輸出靜態變量時屬性的遍歷深度,默認為 0,即直接使用 toString 輸出
Jad
反編譯指定已加載類的源碼,可以通過 jad 命令來反編譯代碼,jad 命令將 JVM 中實際運行的 class 的 byte code 反編譯成 java 代碼,便于你理解業務邏輯。
- jad demo.MathGame

默認情況下,反編譯結果里會帶有ClassLoader信息,通過--source-only選項,可以只打印源代碼。方便和mc/redefine命令結合使用。輸入 Q 或者 Ctrl+C 退出watch命令。
參數說明
- class-pattern:類名表達式匹配
- [c:]:類所屬 ClassLoader 的 hashcode
- [E]:開啟正則表達式匹配,默認為通配符匹配
jvm
查看當前JVM信息

trace
方法內部調用路徑,并輸出方法路徑上的每個節點上耗時,trace 命令能主動搜索 class-pattern/method-pattern 對應的方法調用路徑,渲染和統計整個調用鏈路上的所有性能開銷和追蹤調用鏈路。

我們可以看到 “---[0.128988ms] java.io.PrintStream:println() #28”耗時較長。
參數說明
- class-pattern:類名表達式匹配
- method-pattern:方法名表達式匹配
- condition-express:條件表達式
- [E]:開啟正則表達式匹配,默認為通配符匹配
- [n:]:命令執行次數
- #cost:方法執行耗時
stack
輸出當前方法被調用的調用路徑,很多時候我們都知道一個方法被執行,但這個方法被執行的路徑非常多,或者你根本就不知道這個方法是從那里被執行了,此時你需要的是 stack 命令。

參數說明
- class-pattern:類名表達式匹配
- method-pattern:方法名表達式匹配
- condition-express:條件表達式
- [E]:開啟正則表達式匹配,默認為通配符匹配
- [n:]:執行次數限制
Arthas 其他基礎命令
- help:查看命令幫助信息
- cls:清空當前屏幕區域
- session:查看當前會話的信息
- reset:重置增強類,將被 Arthas 增強過的類全部還原,Arthas 服務端關閉時會重置所有增強過的類
- version:輸出當前目標 Java 進程所加載的 Arthas 版本號
- history:打印命令歷史
- quit:退出當前 Arthas 客戶端,其他 Arthas 客戶端不受影響
- shutdown:關閉 Arthas 服務端,所有 Arthas 客戶端全部退出
- keymap:Arthas快捷鍵列表及自定義快捷鍵
更多詳細介紹,可閱讀Arthas 用戶文檔 — Arthas 3.1.1 文檔