Arthas 是Alibaba開源的Java診斷工具,方便開發者進行問題的定位和診斷。用戶文檔:https://arthas.aliyun.com/doc/
熱編譯: https://developer.aliyun.com/article/690240
- 查看方法調用情況
- 查看方法入參
- 反編譯源碼
- 查看系統的運行狀況
- 監控到JVM的實時運行狀態
- 。。。
安裝
-
方法一,使用arthas-boot(推薦):
wget https://alibaba.github.io/arthas/arthas-boot.jar java -jar arthas-boot.jar
方法二,使用as.sh:
-
curl -L https://alibaba.github.io/arthas/install.sh | sh
idea中安裝Alibaba Cloud Toolkit
安裝成功后會有以下圖
其中Upload上傳文件, 更多里的Diagnostic診斷代碼;
使用arthas修復線上代碼
替換代碼的流程:
1、jad命令 將需要更改的文件先進行反編譯,保存下來 ,編譯器修改
$ jad --source-only com.chitic.supplywater.common.controller.DahuaApiImpl > /tmp/common/DemoApplication.java
修改完以后需要將類重新加載到JVM
2、SC命令 查找當前類是哪個classLoader加載的
$ sc -d com.chitic.supplywater.common.controller.DahuaApiImpl | grep classLoader
classLoaderHash 20ad9418 #類加載器 編號
3、MC命令 用指定的classloader重新將類在內存中編譯
$ mc -c 20ad9418 /tmp/common/DemoApplication.java -d /tmp/common Memory compiler output: /tmp/common/com/chitic/supplywater/common/controller/DemoApplication.class
注意:mc編譯可能出錯,可以在本地編譯好然后上傳到服務器
4、redefine命令 將編譯后的類加載到JVM
上邊編譯后的.class文件地址
$ redefine -c 20ad9418 /tmp/common/com/chitic/supplywater/common/controller/DemoApplication.class redefine success, size: 1
Idea插件下的Diagnostic
1,會執行 java -jar /root/.arthas/lib/3.4.3/arthas/arthas-boot.jar
java -jar /root/.arthas/lib/3.4.3/arthas/arthas-boot.jar [INFO] arthas-boot version: 3.4.3 [INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER. * [1]: 10016 /usr/local/supplywater/javaCode/app/chitic-supplywater-app-service-1.5.0-SNAPSHOT.jar [2]: 10864 /usr/local/supplywater/javaCode/data/chitic-supplywater-data-service-1.5.0-SNAPSHOT.jar [3]: 10515 /usr/local/supplywater/javaCode/update/chitic-supplywater-update-service-1.5.0-SNAPSHOT.jar [4]: 10643 /usr/local/supplywater/javaCode/mock/chitic-supplywater-mock-1.5.0-SNAPSHOT.jar [5]: 10772 /usr/local/supplywater/javaCode/hub/chitic-supplywater-hub-service-1.5.0-SNAPSHOT.jar [6]: 10175 /usr/local/supplywater/javaCode/common/chitic-supplywater-common-service-1.5.0-SNAPSHOT.jar
2,選擇第幾個java程序診斷,這里選擇6,出現以下界面
3,輸入dashboard,按回車/enter
,會展示當前進程的信息,按ctrl+c
可以中斷執行。

4, 通過thread命令來獲取進程的main class
5,通過sc [java文件類路徑] : sc com.gx.*
6,通過jad 反編譯class文件,輸出指定文件
jad --source-only com.chitic.supplywater.common.controller.DahuaApiImpl > /tmp/common/DemoApplication.java
命令中 --source-only 的含義為,只輸出源碼部分,如果不加這個參數,在反編譯出的內容頭部會攜帶類加載器的信息: ClassLoader: +-sun.misc.Launcher$AppClassLoader@18b4aac2 +-sun.misc.Launcher$ExtClassLoader@20d5ad12 Location: /Users/xujingfeng/IdeaProjects/arthas-demo/target/classes/
exit退出當前回話
stop徹底退出