「原创声明:保留所有权利,禁止转载」
arthas
是一个Java
开源诊断神器。
今天分享一个非常重要的命令redefine
,主要作用是加载外部的.class
文件,用来替换JVM
已经加载的类,总结起来就是实现了Java
的热更新。
redefine
在一下几种情况中会失败:1、增加了field
;2、增加了method
;3、替换正在运行的方法。
前两个比较好理解,第三个意思就是这个方法必须结束之后才会被替换,如果有个方法开始运行之后就不会跳出,那么这个方法所在的类是无法被替换的,类似无限循环的方法。
中间提到了将本地的.class
文件上传到服务器的技巧,个人没有采用,如果是要热更新,完全可以利用mc
这个命令在服务端编译更新后的代码,然后进行本地替换。
arthas 命令 redefine 实现 Java 热更新
代码
package com.fun;
import com.fun.frame.SourceCode;
import org.slf4j.Logger;
import java.util.ArrayList;
import java.util.List;
public class Fun extends SourceCode {
int[] ss = new int[1024];
public static Logger logger = getLogger(Fun.class);
public static void main(String[] args) {
List<Fun> funs = new ArrayList<>();
while (true) {
Fun fun = new Fun();
funs.add(fun);
sleep(3000);
test();
output(funs.size());
}
}
public static void test() {
logger.info("成功!!!");
}
}
- 调用
test()
方法会打印日志的,如果是该方法被其他地方调用,修改之后也会生效。
- 郑重声明:“FunTester” 首发,欢迎关注交流,禁止第三方转载。更多原创文章:FunTester 原创合集。
技术类文章精选
- Linux 性能监控软件 netdata 中文汉化版
- 图解 HTTP 脑图
- 性能测试中图形化输出测试数据
- JMeter 吞吐量误差分析
- JMeter 如何模拟不同的网络速度
- 手机号验证码登录性能测试
- 接口测试视频专题
无代码文章精选
TesterHome 为用户提供「保留所有权利,禁止转载」的选项。
除非获得原作者的单独授权,任何第三方不得转载标注了「原创声明:保留所有权利,禁止转载」的内容,否则均视为侵权。
具体请参见TesterHome 知识产权保护协议。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。