下载 Arthas
arthas-boot方式(官方推荐方式)
curl -O https://arthas.aliyun.com/arthas-boot.jar
监测目标程序
# 运行方式1,先运行,在选择 Java 进程 PID
java -jar arthas-boot.jar
# 选择进程(输入[]内编号(不是PID)回车)
[INFO] arthas-boot version: 3.5.0
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 8260 cn.wanda.wic.content.manager.WicContentManager
[2]: 22276 org.apache.catalina.startup.Bootstrap
[3]: 9095 com.sinovatech.rd.brand.schedule.ScheduleMain
[4]: 3546 cn.wanda.wic.content.job.WicContentJob
[5]: 10764 cn.wanda.wic.content.admin.WicContentAdmin
[6]: 9743 org.apache.catalina.startup.Bootstrap
# 运行方式2,运行时选择 Java 进程 PID
java -jar arthas-boot.jar [PID]
具体步骤
概括:
jad
:反编译指定类的代码。mc
:Memory Compiler/内存编译器,用于编译.java文件生成.class文件。redefine
:加载外部的.class文件,替换掉当前JVM中同名类。
步骤一:jad命令反编译类
首先,使用 jad
命令反编译你想要修改的类。
# jad --source-only com.example.YourClass > /tmp/YourClass.java
jad --source-only cn.wanda.wic.business.admin.service.notice.EnterpriseNoticeApiService > /tmp/EnterpriseNoticeApiService.java
这个命令会将 com.example.YourClass
类反编译后的源代码输出到 /tmp/YourClass.java
文件中。
步骤二:修改代码、mc编译、加载(弃用)
mc命令会报错,官方说bug挺多,不好维护,采用下面的方式
修改 /tmp/YourClass.java
文件。也可以本地上传(线上修改记得新切一个tab页)
vim /tmp/EnterpriseNoticeApiService.java
修改完成后,使用 mc
命令来编译这个Java文件。
mc /tmp/EnterpriseNoticeApiService.java -d /tmp
这个命令会在 /tmp
目录下生成编译后的 .class
文件。
redefine命令加载新的类
最后,使用 redefine
命令来加载新的 .class
文件,替换掉JVM中的旧版本类。
redefine /tmp/EnterpriseNoticeApiService.class
执行这个命令后,JVM中的 com.example.YourClass
类将会被新的 .class
文件替换,而不需要重启应用。
步骤二:本地修改代码、编译并上传
上传这个文件
retransform 命令加载新的类
retransform /tmp/EnterpriseNoticeApiService.class
测试效果
接口调用
完结撒花!!!
参考文档
redefine命令:redefine | arthas
retransform命令:retransform | arthas