如何不重启热更新线上 Java 代码?

栏目: IT技术 · 发布时间: 5年前

内容简介:作者:未分配微服务https://www.cnblogs.com/orange911/p/10583245.html

如何不重启热更新线上  <a href='https://www.codercto.com/topics/22013.html'>Java</a>  代码?

一、前言

热更新代码的场景

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文件所在目录+文件名>

6、更新完毕不出意外会立即生效,这时候就可以去验证代码是否生效了

作者:未分配微服务

https://www.cnblogs.com/orange911/p/10583245.html

----------  END  ----------

推荐一个技术号

Github实验室,由国内985博士、硕士组成的团体运营。主要分享和研究业界开源项目,学习资源,程序设计,学术交流。 关注就无套路送你一份BAT算法大礼包。

如何不重启热更新线上 Java 代码?


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Google是如何控制世界的

Google是如何控制世界的

(美)丹尼尔·伊克比亚 / 李军 / 东方出版社 / 2008-08 / 36.00元

秘Google的发展之路! Google,这个有着数百亿的网页存储量、每天两亿搜索次数的搜索引擎,最初仅仅是一个方程式。这个由拉里·佩奇和塞吉·布林两位天才创造出的超级算法甚至比可口可乐的配方还要保密。 当广告公司为自己网页在搜索结果中的排序争得头破血流时,Google正悠然地坐收渔翁之利,这种天才的拍卖广告链接的商业模式给Google带来了令人瞠目结舌的企业利润!仅仅从1999~20......一起来看看 《Google是如何控制世界的》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

在线进制转换器
在线进制转换器

各进制数互转换器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换