线上代码热更新

下载 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]

具体步骤

概括:

  1. jad:反编译指定类的代码。
  2. mc:Memory Compiler/内存编译器,用于编译.java文件生成.class文件。
  3. 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

mc功能异常:https://github.com/alibaba/arthas/issues/2854

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值