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
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
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彻底退出