簡介
官方文檔鏈接:https://arthas.aliyun.com/doc/quick-start.html
啟動arthas
方式一:java -jar arthas-boot
方式二:java -jar arthas-boot pid
兩種方式都可以,方式二要預先知道JAVA進程的PID
命令列表
控制面板
適用場景
場景一:查看當前jvm的線程執行狀態,也可以使用thread命令
場景二:查看jvm的內存使用
示例
1dashboard
查看class源碼
適用場景
場景一:測試/生產環境已經發布,方法執行與預期不符,無法確認類文件是否發布成功
場景二:測試/生產環境代碼執行報錯,暫時無法通過IDE工具查看源碼
示例
# eg. com.demo.MainClass
jad --``source``-only com.demo.MainClass
|
監聽方法執行
適用場景
場景一:代碼執行異常,暫無法通過本地IDE工具進行DEBUG,通過日志又無法定位問題
場景二:查看方法的參數、返回結果
場景三:統計方法的執行耗時
示例
準備監聽方法
# eg. com.demo.MainClass.doAnyThing()
tt -t com.demo.MainClass doAnyThing
# 監聽通用方法可以加參數以防止方法數量過多
tt -t com.demo.MainClass doAnyThing params[0].customerId==3
查看監聽列表
查看監聽的方法列表
# 查看監聽的方法列表
tt -l
# 監聽的方法太多,只查看入參customerId=3的方法
tt -s params[0].customerId==3
查看監聽方法的明細
# 通過index來查看監聽方法的詳細信息
tt -i 1000
# 只想查看入參中的某個對象,不想全量查看,可以加-w參數
tt -i 1000 -w params[0].userVO
tt -i 1000 -w returnObj.response
熱更新class文件
適用場景
生產環境無法隨時重啟部署,通過retransform對運行的jvm中的class文件進行替換,以達到不發布即可更新代碼的目的
示例
# 指定絕對的class路徑加載到jvm內存中
retransform ``/tmp/com/example/demo/arthas/user/UserController``.class
生產環境的服務器一般是多臺,手動執行風險極高,而且屬于奇技淫巧,不推薦當作正常發布的流程
生成JVM火焰圖
適用場景
希望觀察jvm在一定時間內的cpu負荷
示例
# 單位:秒,執行300秒后結動結束,默認采集cpu,默認生成svg格式
profiler start --duration 300