Arthas使用指南
官方文檔:https://arthas.aliyun.com/doc/commands.html
安裝方式
-
從阿里云下載jar包
curl ‐O https://arthas.aliyun.com/arthas‐boot.jar
-
github下載
wget https://alibaba.github.io/arthas/arthas‐boot.jar
-
Gitee 下載
wget https://arthas.gitee.io/arthas‐boot.jar
-
打印幫助信息
java ‐jar arthas‐boot.jar ‐h
運(yùn)行
1.netstat -nap|grep port 或 Jps
2.java ‐jar arthas‐boot.jar [PID]
命令生成插件
- idea安裝“arthas idea”插件
- 方法名單擊右鍵,選擇命令,示例如下圖:

常用命令
dashboard 當(dāng)前系統(tǒng)的實(shí)時(shí)數(shù)據(jù)面板
thread 查看當(dāng)前 JVM 的線程堆棧信息
watch 方法執(zhí)行數(shù)據(jù)觀測(cè)
trace 方法內(nèi)部調(diào)用路徑,并輸出方法路徑上的每個(gè)節(jié)點(diǎn)上耗時(shí)
stack 輸出當(dāng)前方法被調(diào)用的調(diào)用路徑
tt 方法執(zhí)行數(shù)據(jù)的時(shí)空隧道,記錄下指定方法每次調(diào)用的入?yún)⒑头祷匦畔?,并能?duì)這些不同的時(shí)間下調(diào)用進(jìn)行觀測(cè)
monitor 方法執(zhí)行監(jiān)控
jvm 查看當(dāng)前 JVM 信息
vmoption 查看,更新 JVM 診斷相關(guān)的參數(shù)
sc 查看 JVM 已加載的類信息
sm 查看已加載類的方法信息
jad 反編譯指定已加載類的源碼
classloader 查看 classloader 的繼承樹,urls,類加載信息
heapdump 類似 jmap 命令的 heap dump 功能
reset 重置增強(qiáng)類,將被 Arthas 增強(qiáng)過(guò)的類全部還原,Arthas 服務(wù)端關(guān)閉時(shí)會(huì)重置所有增強(qiáng)過(guò)的類
quit 退出當(dāng)前 Arthas 客戶端,其他 Arthas 客戶端不受影響
shutdown 關(guān)閉 Arthas 服務(wù)端,所有 Arthas 客戶端全部退出
命令詳解
dashboard
ID: Java級(jí)別的線程ID,注意這個(gè)ID不能跟jstack中的nativeID一一對(duì)應(yīng)
NAME: 線程名 GROUP: 線程組名 PRIORITY: 線程優(yōu)先級(jí), 1~10之間的數(shù)
字,越大表示優(yōu)先級(jí)越高
STATE: 線程的狀態(tài)
CPU%: 線程消耗的cpu占比,采樣100ms,將所有線程在這100ms內(nèi)的cpu使用
量求和,再算出每個(gè)線程的cpu使用占比。
TIME: 線程運(yùn)行總時(shí)間
INTERRUPTE: 線程當(dāng)前的中斷位狀態(tài)
DAEMON: 是否是daemon線程
thread
thread查看所有線程信息,同時(shí)會(huì)列出每個(gè)線程的 CPU 使用率
thread [N]查看 CPU 消耗較高的 N號(hào)線程信息,可以看到 CPU 使用較高的方法和行數(shù)。
thread -n [顯示的線程個(gè)數(shù)] ,就可以排列出 CPU 使用率 Top N 的線程
thread | grep pool 命令可以查看線程池里的線程信息
thread -b 命令查看直接定位到死鎖信息。支持synchronized
線程常見狀態(tài):
RUNNABLE運(yùn)行中TIMED_WAITIN調(diào)用了以下方法的線程會(huì)進(jìn)入
Thread#sleep()
Object#wait() 并加了超時(shí)參數(shù)
Thread#join() 并加了超時(shí)參數(shù)
LockSupport#parkNanos()
LockSupport#parkUntil()WAITING當(dāng)線程調(diào)用以下方法時(shí)會(huì)進(jìn)入:
Object#wait() 而且不加超時(shí)參數(shù)
Thread#join() 而且不加超時(shí)參數(shù)
LockSupport#park()BLOCKED阻塞,等待鎖
jad
jad com.demo.arthas.ArthasTest 可以使用 jad 命令直接反編譯 class
ognl '@com.demo.arthas.ArthasTest@hashSet' 查看變量 hashSet 中的數(shù)據(jù)
ognl '@com.demo.arthas.ArthasTest@hashSet.size()' 查看靜態(tài)變量 hashSet 大小
trace
使用 trace 命令開始檢測(cè)耗時(shí)情況
啟動(dòng)應(yīng)用后,在arthas控制臺(tái)輸入如下命令:
trace com.demo.User.UserController getUser
訪問(wèn)http://localhost:8080/arthas/user?uid=3
繼續(xù)跟蹤耗時(shí)高的方法輸入命令:
trace com.demo.User.UserService get
然后再次訪問(wèn):http://localhost:8080/arthas/user?uid=3
monitor
使用 monitor 命令監(jiān)控統(tǒng)計(jì)方法的執(zhí)行情況。
每5秒統(tǒng)計(jì)一次 com.demo.User.UserService 類的 get 方法執(zhí)行情況。
輸入命令:monitor -c 5 com.demo.User.UserService get
訪問(wèn):http://localhost:8080/arthas/user?uid=3。
watch
使用 watch 命令輕松查看輸入輸出參數(shù)以及異常等信息。
查看入?yún)⒊鰠?br>
輸入命令:
watch com.**.**.endpoint.BargainPlayApplyCycleEndPoint fetchPlayDetailRenderData '{params,returnObj,throwExp}' -n 5 -x 3 'params[0].getPlayToolDO().getId()==588'
命令解釋:'{params,returnObj,throwExp}'表示觀測(cè)對(duì)象,這里選擇了入?yún)?、出參和異常?n 5表示觀測(cè)到5次后停止,-x 3表示打印觀測(cè)對(duì)象的時(shí)候只打印3層嵌套結(jié)構(gòu),'params[0].getPlayToolDO().getId()==588' 為條件表達(dá)式,滿足該條件的才會(huì)被觀測(cè)到
stack
使用 stack命令查看方法的調(diào)用信息。
觀察 類com.demo.User.UserService 的 mysql 方法調(diào)用路徑
輸入命令:stack com.demo.User.UserService mysql
訪問(wèn):http://localhost:8080/arthas/user?uid=3
tt
方法調(diào)用時(shí)空隧道
tt 命令方法執(zhí)行數(shù)據(jù)的時(shí)空隧道,記錄下指定方法每次調(diào)用的入?yún)⒑头祷匦?br>
息,并能對(duì)這些不同的時(shí)間下調(diào)用進(jìn)行觀測(cè) 。
開始記錄方法調(diào)用信息:tt -t com.demo.User.UserService check
多次訪問(wèn):http://localhost:8080/arthas/user?uid=3
查看記錄的方法調(diào)用信息: tt -l
查看調(diào)用記錄的詳細(xì)信息(-i 指定 INDEX): tt -i 1005
熱部署
熱部署步驟
本地修改代碼,編譯好后再上傳到服務(wù)器上。有的服務(wù)器不允許直接上傳文件,可以使用
base64命令來(lái)繞過(guò)-
retransform 指定的 .class 文件
$ retransform /tmp/MathGame.class retransform success, size: 1, classes: demo.MathGame -
查看retransform entry
$ retransform -l Id ClassName TransformCount LoaderHash LoaderClassName 1 demo.MathGame 1 null null -
消除retransform的影響
- 刪除這個(gè)類對(duì)應(yīng)的 retransform entry(retransform -d 1)
- 重新觸發(fā) retransform
注意點(diǎn)
arthas retransform熱部署時(shí)候,不能修改方法名、屬性字段,只能修改方法體里面的代碼。
正在跑的函數(shù),沒有退出不能生效
不建議使用redefine命令熱部署。執(zhí)行完redefine之后,再執(zhí)行jad/watch/trace/monitor/tt等命令,會(huì)使熱部署失效
退出arthas
quit命令
只是退出當(dāng)前 Arthas 客戶端,Arthas 的服務(wù)器端并沒有關(guān)閉,所做的修改也不會(huì)被重置。
stop命令
關(guān)閉 Arthas 服務(wù)端,所有 Arthas 客戶端全部退出。但是用 retransform 重加載的類內(nèi)容不會(huì)被重置