Arthas非常重要的命令redefine,主要作用是加载外部的.class文件,用来替换JVM已经加载的类,总结起来就是实现了Java的热更新。
redefine在一下几种情况中会失败:1、增加了field;2、增加了method;3、替换正在运行的方法。
前两个比较好理解,第三个意思就是这个方法必须结束之后才会被替换,如果有个方法开始运行之后就不会跳出,那么这个方法所在的类是无法被替换的,类似无限循环的方法。
场景需求
举个例子,在线上代码某个class的方法添加日志输出,修改方法返回结果,但是,又不想直接修改class
只需操作如下:
1.上传修改后的class文件到服务器任意路径,比如:/usr/local/arthas/file/ParserFileService.class
2.下载 Arthas(阿尔萨斯)
3.根据java程序 pid 运行arthas,# ./as.sh 4334
4.通过redefine加载修改后的class文件,$ redefine /data/web/ParserFileService.class
5.验证效果,结束
6.这个方式只是修改运行时内存,class文件并没有改变,服务重启就失效了,如需永久生效需替换原文件
如下效果是添加简单的脚本,自动依据pid运行arthas,省去每次专门查看pid的过程
脚本如下:
脚本放置与需上传class文件同级目录即可。
#!/bin/bash
PID=`ps aux|grep [p]roject|awk '{print $2}'`if [ $? -eq 0 ];
thenecho PID is $PID.cd /usr/local/arthas/sh as.sh $PID
elseecho PID not exist.
fi
注:grep [p]roject等同于 grep -v project;project是项目名
————————————————
版权声明:本文为CSDN博主「IT_狂奔者」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chj_1224365967/article/details/107617415