使用Arthas热更新线上代码

一般线上问题比开发环境的问题更难解决,一个主要的原因便在于开发态可以任意 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 是不同的机制,同时使用两种机制来更新字节码,只有最后修改的会生效。

条件限制

使用热更新功能有一些条件限制,我们只能用它来修改方法内部的一些业务代码,如果我们出现了以下任意一种情况,那么热更新就会执行失败:

  1. 增加类属性(类字段);
  2. 增加或删除方法;
  3. 替换正在运行的方法。

 

posted @ 2022-07-07 10:25  愤怒的码农  阅读(797)  评论(0编辑  收藏  举报