背景
尽管在生产环境热更新代码,并不是很好的行为,很可能导致:热更不规范,同事两行泪。
但很多时候我们的确希望能热更新代码,比如:
线上排查问题,找到修复思路了,但应用重启之后,环境现场就变了,难以复现。怎么验证修复方案?
步骤
步骤1: jad命令反编译代码
步骤2: 文本编辑器修改代码
步骤3: sc命令查找代码所在类的ClassLoader
步骤4: mc命令指定ClassLoader编译代码
步骤5: redefine命令热更新代码
实战
步骤1: jad命令反编译代码
$ jad --source-only com.kfit.jvmfullgc.controller.HelloController > /data/tmp/HelloController.java
步骤2: 文本编辑器修改代码
使用文本工具修改在/data/tmp目录下的HelloController.java文件。
步骤3: sc命令查找代码所在类的ClassLoader
$sc -d *HelloController | grep classLoaderHash
说明:
(1)sc是search class的简称,查找到所有JVM已经加载到的类。
① -d (details): 通过-d参数,可以打印出类加载的具体信息。
(2)grep 过滤信息。
步骤4: mc命令指定ClassLoader编译代码
$mc -c 18b4aac2 /data/tmp/HelloController.java -d /data/tmp
说明:
(1)mc : Memory Compiler/内存编译器,编译.java文件生成.class,通过-c来指定classloader。
步骤5: redefine命令热更新代码
$ redefine /data/tmp/com/kfit/jvmfullgc/controller/HelloController.class
说明:使用redefine热加载class。
检验热更新结果,重新访问看下是否正常了。