Arthas 热替换
就在昨天,一个运行多年的系统出问题了,一个关键的点没有日志打印,怎么办,替包? 不合适。
于是想到了Arthas的redefine支持加载.class文件。
热替换步骤
- 使用jad反编译并输出源码,命令如下:
jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
-
使用vi 命令修改UserController.java文件
-
使用sc拿到classLoader的Hash值
sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash
classLoaderHash 2c20c3ff
- 使用mc命令编译修改过的UserController.java
mc -c 2c20c3ff /tmp/UserController.java -d /tmp
- 使用redefine加载字节码到内存
redefine /tmp/com/example/demo/arthas/user/UserController.class
可能遇到的问题
- 保证你的arthas运行环境是jdk而不是jre(最好环境变量中配置也是jdk)
- mc命令如果执行不成功,那么直接在本地修改代码,编译后将.java文件上传至服务器
- 执行redefine后,不要再使用jad去验证是否已经成功加载你的修改,使用jad会覆盖你的修改,使你的修改无效。(redefine命令和jad/watch/trace/monitor/tt等命令会冲突。执行完redefine之后,如果再执行上面提到的命令,则会把redefine的字节码重置)
- 如果你看到了这篇博文,官方已经推出了一个新的命令 retransform来代替redefine,到官网下载一个最新的全量包使用就好。
- retransform命令
retransform /tmp/com/example/demo/arthas/user/UserController.class
另外需要注意: