如何用Arthas重启热更新

蜗牛 互联网技术资讯 2021-12-21 249 0

如何用Arthas重启热更新,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

一、前言

热更新代码的场景

1)当线上服务器出现问题时,有些时候现有的手段不足以发现问题所在,可能需要追加打印日志或者增加一些调试代码,如果我们去改代码重新部署,会破坏问题现场,可以通过热部署的手段来增加调试代码

2)线上出现紧急bug,通过Review代码找到问题,修改好后打包部署的流程可能比较久,可以通过热部署代码及时解决问题。

 

二、Arthas的使用

使用Java诊断工具---Arthas,他可以附着在我们的Java服务器进程上面,查看服务器状态,jvm状态等各种参数指标,还可以进行热更新。

1、下载启动Arthas

wget https://alibaba.github.io/arthas/arthas-boot.jarjava -jar arthas-boot.jar
 
2、启动后会显示当前机器上面所有的java进程,选择我们需要监控/修改的进程,输入序号回车
 

3、一些常用命令,如果线上出现问题,可以通过以下命令查看各项指标是否有异常

   
     
   
   
   dashboard——当前系统的实时数据面板thread——查看当前 JVM 的线程堆栈信息jvm——查看当前 JVM 的信息sysprop——查看和修改JVM的系统属性sysenv——查看JVM的环境变量getstatic——查看类的静态属性
 

1)打印前五名最消耗CPU的线程,可以及时找到CPU过高的代码位置

thread -n 5
 
2)查看某个函数的调用堆栈
 
stack <类全包名> <函数名>
 
3)查看某个函数的哪个子调用最慢,耗时最久的调用会标红显示,可以方便找出某个功能中最耗时的操作
 
trace <类全包名> <函数名>
 
4)监控某个函数的调用统计数据,包括总调用次数,平均运行时间,成功率等信息
 
monitor <类全包名> <函数名>
 
4、输入exit可以退出当前的连接,但是附着在服务器进程上的Arthas依然在运行,完全退出可以输入shutdown
   

三、热更新

1、首先找到我们需要更新代码的全包名,通过jad命令将线上正在运行的代码反编译出来

jad --source-only <全包名> > <导出目录+文件名>
 
2、拿到java代码后,我们根据需求来修改代码,需要注意的是这里热更新代码的实际原理是调用Java基础类java.lang.instrument.Instrumentation的redefineClasses方法,他可以通过修改字节码来替换已有的class文件,其中有诸多的限制:
 

1)比如不能增加或删除field/method

2)没有退出的函数不能生效,比如一个函数体内是一个where(true)循环,永远不会结束,那么我们修改的代码也永远不会生效

我们可以在函数中增加一些代码,比如增加日志打印等

3、修改好代码后,我们要找到这个这个类对应的类加载器,再去加载这个class,执行如下命令会返回类加载器的对象地址

sc -d <全包名> | grep classLoaderHash
 
4、通过内存编译将Java文件编译成Class文件
 
mc -c <类加载器的对象地址> <Java文件所在目录+文件名>
 
5、最后,我们通过命令将class文件进行热更新
 
redefine <Class文件所在目录+文件名>

关于如何用Arthas重启热更新问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注蜗牛博客行业资讯频道了解更多相关知识。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

评论

有免费节点资源,我们会通知你!加入纸飞机订阅群

×
天气预报查看日历分享网页手机扫码留言评论Telegram