一般线上问题比开发环境的问题更难解决,一个主要的原因便在于开发态可以任意 debug 断点调试,而线上环境一般不允许远程调试,所以在实践中,我一般习惯用 Arthas 来定位线上的问题。
Arthas 是阿里巴巴开源的 Java 应用诊断利器
Arthas 可以完成很多骚操作,今天给大家介绍的 Arthas 诊断技巧便是 – 热更新线上代码
前置需求
排查发现线上代码HelloWorld.java文件中某个方法的代码有NPE问题,需要通过arthas热更解决
实施步骤
1、首先准备好要热更的字节码文件,可本地通过IDE编译生成,也可通过arthas提供的jad和mc命令配合生成
2、通过sc命令查找类的加载器
3、通过redefine命令热更
热更新注意事项
redefine 特别说明
redefine
命令和 jad
/watch
/trace
/monitor
/tt
等命令会冲突。
执行完 redefine
之后,如果再执行上面提到的命令,则会把 redefine
的字节码重置。
原因是 jdk 本身 redefine 和 Retransform 是不同的机制,同时使用两种机制来更新字节码,只有最后修改的会生效。
条件限制
使用热更新功能有一些条件限制,我们只能用它来修改方法内部的一些业务代码,如果我们出现了以下任意一种情况,那么热更新就会执行失败:
- 增加类属性(类字段);
- 增加或删除方法;
- 替换正在运行的方法。