阿里重磅開源性能測試神器,性能監(jiān)控分析工具 Arthas
Arthas(阿爾薩斯)是Alibaba開源的Java診斷性能監(jiān)控分析工具,它不需要做任何的參數(shù)配置,就可以直觀的獲取各種維度的性能數(shù)據(jù)。通過閱讀官網(wǎng)的介紹,可以看到,當(dāng)我們遇到以下類似問題而束手無策時,Arthas可以幫助我們解決:
- 這個類從哪個 jar 包加載的?為什么會報各種類相關(guān)的 Exception?
- 我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯了?
- 遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎?
- 線上遇到某個用戶的數(shù)據(jù)處理有問題,但線上同樣無法 debug,線下無法重現(xiàn)!
- 是否有一個全局視角來查看系統(tǒng)的運行狀況?
- 有什么辦法可以監(jiān)控到JVM的實時運行狀態(tài)?
Arthas支持JDK 6+,支持Linux/Mac/Winodws,采用命令行交互模式,同時提供豐富的 Tab 自動補(bǔ)全功能,進(jìn)一步方便進(jìn)行問題的定位和診斷。
安裝
使用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時,會自動下載一些依賴包,等待下載完成,就會進(jìn)入到arthas提供的命令行界面。

dashboard 實時監(jiān)控數(shù)據(jù)
dashboard命令可以查看當(dāng)前系統(tǒng)的實時數(shù)據(jù)面板。

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

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

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

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

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

trace
方法內(nèi)部調(diào)用路徑,并輸出方法路徑上的每個節(jié)點上耗時,trace 命令能主動搜索 class-pattern/method-pattern 對應(yīng)的方法調(diào)用路徑,渲染和統(tǒng)計整個調(diào)用鏈路上的所有性能開銷和追蹤調(diào)用鏈路。

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

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