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