what
Arthas 是Alibaba開源的Java診斷工具,基于 Greys 進行二次開發的全新在線診斷工具,利用Java6的Instrumentation特性,動態增強你所指定的類,獲取你想要到的信息, 采用命令行交互模式,同時提供豐富的 Tab 自動補全功能。
where
why
主要用在java在線實時debug,并且可以實時修復bug
how-常用命令
- dashboard
當前系統的實時數據面板,按ctrl+c(q)可以中斷執行。 - thread
查看當前 JVM 的線程堆棧信息
通過thread命令來獲取到arthas-demo進程的Main Class
thread 1 | grep 'main('
- jvm
查看當前 JVM 的信息 - sc
查看已加載類的方法信息
查看函數
sm com.myweb.dataacquisition.protocol.userdefined.constdata.inner.UserDefinedInner toInner
- sm
查看已加載類的方法信息 - jad
反編譯指定已加載類的源碼
通過jad來反編譯Main Class
jad demo.MathGame
- classloader
查看classloader的繼承樹,urls,類加載信息,使用classloader去getResource - monitor
方法執行監控 - watch
方法執行數據觀測
查看某個函數調用入出數據項
watch com.myweb.dataacquisition.protocol.userdefined.constdata.inner.UserDefinedInner toInner '{params, returnObj}' -x 2
- trace
方法內部調用路徑,并輸出方法路徑上的每個節點上耗時
trace追蹤某個函數調用鏈
trace -j com.myweb.dataacquisition.protocol.userdefined.constdata.inner.UserDefinedInner toInner
- stack
輸出當前方法被調用的調用路徑 - tt
方法執行數據的時空隧道,記錄下指定方法每次調用的入參和返回信息,并能對這些不同的時間下調用進行觀測
tt -t com.myweb.dataacquisition.protocol.userdefined.constdata.inner.UserDefinedInner toInner
- reset
重置增強類,將被 Arthas 增強過的類全部還原,Arthas 服務端關閉時會重置所有增強過的類 - quit
退出當前 Arthas 客戶端,其他 Arthas 客戶端不受影響 - shutdown
關閉 Arthas 服務端,所有 Arthas 客戶端全部退出
實時修改源代碼,編譯,運行(very有趣)
第一步:
jad反編譯代碼
jad --source-only com.myweb.dataacquisition.protocol.userdefined.constdata.inner.UserDefinedInner > /tmp/UserDefinedInner.java
第二步:
修改反編繹出來的代碼
第三步
sc查找加載UserDefinedInner的ClassLoader
sc -d *UserDefinedInner | grep classLoaderHash
classLoaderHash 18b4aac2
第四步
mc內存編繹代碼
保存好/tmp/UserDefinedInner.java之后,使用mc(Memory Compiler)命令來編譯,并且通過-c參數指定ClassLoader:
mc -c 18b4aac2 /tmp/UserDefinedInner.java -d /tmp
第五步
redefine熱更新代碼
再使用redefine命令重新加載新編譯好的UserController.class:
redefine E:\tmp\com\myweb\dataacquisition\protocol\userdefined\constdata\inner\UserDefinedInner.class
其他用途查看github,很多有趣示例