arthas-boot的使用記錄概要

使用arthas-boot進行分析

  1. arthas可以幫我們解決

這個類從哪個 jar 包加載的?爲什麼會報各種類相關的 Exception?
我改的代碼爲什麼沒有執行到?難道是我沒 commit?分支搞錯了?
遇到問題無法在線上 debug,難道只能通過加日誌再重新發布嗎?
線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
是否有一個全局視角來查看系統的運行狀況?
有什麼辦法可以監控到JVM的實時運行狀態?

  1. 下載運行
curl -O https://arthas.gitee.io/arthas-boot.jar
java -jar arthas-boot.jar
  1. 基礎命令分析
- 查看當前進程信息,Ctrl+c進行中斷
dashboard


- 查看cpu佔用高的3個線程 類似top -H,但是能看到堆棧信息
thread -n 3
thread    顯示所有線程的信息
thread pid 顯示指定線程的運行堆棧
thread -n N 指定最忙的前N個線程並打印堆棧
thread -b 找出當前阻塞其他線程的線程
thread -i 指定採樣時間間隔 (如:thread -n 3 -i 1000,每秒統計最忙的前三個線層)
thread –state ,查看指定狀態的線程


- 跟蹤某個方法的調用時間【顯示的條數】
trace 包名.類名 方法名 [-n 數字]


- monitor命令可以監控方法的執行情況。比如調用成功次數,失敗次數,失敗率、平均執行時間等等。默認120秒輸出一次,也就是說,當我們輸入monitor命令之後,每120秒就會輸出一次統計結果。
- 通過-c參數可以修改輸出頻率,支持通配符和正則表達式[多長時間輸出一次]
monitor -c 5 包名.類名 方法名


- 進行獲取執行方法的參數【參數第幾個】然後獲取數據【-n 1爲只輸出一條】
- watch 包名.類名 方法名 params[0].get(0).age -n 1
https://www.cnblogs.com/qiaoyihang/p/10533672.html


- 進行方法行爲預測執行timetunnel,記錄下指定方法每次調用的入參和返回信息,並能對這些不同的時間下調用進行觀測,同時可回放該方法調用
tt -t 包名.類名 方法名


- 通過sysprop可以查看所有的系統變量,也可以設置某個系統變量。
- 同理,通過sysenv可以查看所有的操作系統環境變量,也可以查看設置某個環境變量。
sysprop和sysenv

- 通過jvm命令直接輸出當前jvm的各種信息。
jvm


- 通過getstatic命令可以方便的查看類的靜態屬性。
getstatic

- 執行ognl表達式,可執行任意代碼
ognl



- 反編譯
jad 包名.類名


  1. 命令參數解析詳細請參考官方文檔
  • dashboard 大盤整體信息
    在這裏插入圖片描述

  • jvm信息
    在這裏插入圖片描述

  • trace 查看方法執行耗時
    在這裏插入圖片描述

  • monitor 監控頻次信息
    在這裏插入圖片描述

  • watch的監控方法參數信息
    在這裏插入圖片描述

  1. 簡單監控參數
    在這裏插入圖片描述
  2. 觀察方法入參
    在這裏插入圖片描述
  3. 同時觀察方法調用前和方法返回後
    在這裏插入圖片描述
  4. 調整-x的值,觀察具體的方法參數值
watch com.zhiyi.customer.activity.old.report.controller.OldCustomerActivityReportController receiveNewArticleReadData "{params,target}" -x 3 -n 1
-x表示遍歷深度,可以調整來打印具體的參數和結果內容,默認值是1
  1. 條件表達式
$ watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0"
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 68 ms.
ts=2018-12-03 19:36:04; [cost=0.530255ms] result=@ArrayList[
    @Integer[-18178089],
    @MathGame[demo.MathGame@41cf53f9],
]
  1. 觀察異常信息
$ watch demo.MathGame primeFactors "{params[0],throwExp}" -e -x 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 62 ms.
ts=2018-12-03 19:38:00; [cost=1.414993ms] result=@ArrayList[
    @Integer[-1120397038],
    java.lang.IllegalArgumentException: number is: -1120397038, need >= 2
	at demo.MathGame.primeFactors(MathGame.java:46)
	at demo.MathGame.run(MathGame.java:24)
	at demo.MathGame.main(MathGame.java:16)
,
]

-e 表示拋出異常時才觸發
express中,表示異常信息的變量是throwExp
  1. 耗時進行過濾
$ watch demo.MathGame primeFactors '{params, returnObj}' '#cost>200' -x 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 66 ms.
ts=2018-12-03 19:40:28; [cost=2112.168897ms] result=@ArrayList[
    @Object[][
        @Integer[2141897465],
    ],
    @ArrayList[
        @Integer[5],
        @Integer[428379493],
    ],
]
#cost>200(單位是ms)表示只有當耗時大於200ms時纔會輸出,過濾掉執行時間小於200ms的調用
  1. 觀察當前對象中的屬性
如果想查看方法運行前後,當前對象中的屬性,可以使用target關鍵字,代表當前對象

$ watch demo.MathGame primeFactors 'target'
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 52 ms.
ts=2018-12-03 19:41:52; [cost=0.477882ms] result=@MathGame[
    random=@Random[java.util.Random@522b408a],
    illegalArgumentCount=@Integer[13355],
]
然後使用target.field_name訪問當前對象的某個屬性

$ watch demo.MathGame primeFactors 'target.illegalArgumentCount'
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 67 ms.
ts=2018-12-03 20:04:34; [cost=131.303498ms] result=@Integer[8]
ts=2018-12-03 20:04:35; [cost=0.961441ms] result=@Integer[8]

Ongl表達式

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章