Arthas使用指南

Arthas使用指南

官方文檔:https://arthas.aliyun.com/doc/commands.html

安裝方式

運(yùn)行

1.netstat -nap|grep port 或 Jps
2.java ‐jar arthas‐boot.jar [PID]

命令生成插件

  • idea安裝“arthas idea”插件
  • 方法名單擊右鍵,選擇命令,示例如下圖:
image.png

常用命令

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ì)被重置

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容