arthas热更新线上代码

arthas热更新线上代码


Arthas 是阿里巴巴开源的 Java 应用诊断利器,一般习惯用 Arthas 来定位线上的问题,今天给大家介绍的 Arthas 诊断技巧便是 – 热更新线上代码。

在生产环境热更新代码,并不是很好的行为,可能会引发一些问题,请谨慎使用

我们第一步肯定得先在linux上安装上arthas

wget https://arthas.gitee.io/arthas-boot.jar

之后就可以运行arthas了

java -jar arthas-boot.jar

启动后会显示我们正在运行的项目,选择我们要操作的项目

选定后确认进入

此时我们就可以进行下一步的操作来更新线上代码,有两种方案
一、直接替换class文件
将想要修改的类在本地编译后上传至服务器,执行以下命令直接替换文件。

$ redefine /tmp/com.linzi/web/controller/system/HelloService.class

二、直接修改服务器上的文件

1、jad 命令反编译出内存中的字节码,生成 class 文件

$ jad --source-only com.linzi.web.controller.system.HelloService > /tmp/HelloService.java

在这里插入图片描述
命令中 –source-only 的含义为,只输出源码部分,如果不加这个参数,在反编译出的内容头部会携带类加载器的信息:

2、使用 vi 等编辑器对源码进行编辑,修改代码

3、sc 查找类加载器

$ sc -d com.linzi.web.controller.system.HelloService

输出:

 class-info       com.linzi.web.controller.system.HelloService
 code-source       /Users/xujingfeng/IdeaProjects/arthas-demo/target/classes/
 name             com.linzi.web.controller.system.HelloService
 isInterface       false
 isAnnotation      false
 isEnum            false
 isAnonymousClass  false
 isArray           false
 isLocalClass      false
 isMemberClass     false
 isPrimitive       false
 isSynthetic       false
 simple-name       HelloService
 modifier          public
 annotation
 interfaces
 super-class       +-java.lang.Object
 class-loader      +-sun.misc.Launcher$AppClassLoader@18b4aac2
                     +-sun.misc.Launcher$ExtClassLoader@20d5ad12
 classLoaderHash   31cefde0

最后一行 classLoaderHash 即为 HelloService 的类加载器 hash 值。

Arthas 支持 grep,你也可以简化该操作为:

sc -d moe.cnkirito.arthas.demo.HelloService | grep classLoaderHash

4、mc 内存编译

$ mc -c 31cefde0 /tmp/HelloService.java -d /tmp
Memory compiler output:
/tmp/moe/cnkirito/arthas/demo/HelloService.class

使用 -c 指定类加载器的 hash 值。编译完成后,/tmp 目录下会生成对应的 class 字节码文件

5、之后就是redefine 热更新代码

$ redefine /tmp/com/linzi/web/controller/system/HelloService.class

注意:

黑屏化的操作可能会导致误操作
不符合安全生产的规范,不满足可监控、可回滚、可降级

但有时候也有一些场景可以考虑使用 Arthas来热更,例如开发环境无法复现的问题、找到修复思路后临时验证等。

参考文章: https://blog.csdn.net/hengyunabc/article/details/87718469

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值