找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2681|回复: 12

不重启Java服务,如何对线上代码快速热更新?

 火.. [复制链接]
  • 打卡等级:即来则安
  • 打卡总天数:29
  • 打卡月天数:1
  • 打卡总奖励:7791
  • 最近打卡:2025-12-13 17:25:16

2540

主题

1353

回帖

2万

积分

管理员

积分
21301
发表于 2020-3-1 20:13:54 | 显示全部楼层 |阅读模式
需要热更新代码的场景

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

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

Arthas的使用

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

1、下载启动Arthas

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、更新完毕不出意外会立即生效,这时候就可以去验证代码是否生效了


工控课堂 www.gkket.com

0

主题

114

回帖

327

积分

注册会员

积分
327
发表于 2020-3-1 20:13:54 | 显示全部楼层
感谢楼主无私分享!
工控课堂 www.gkket.com

0

主题

82

回帖

130

积分

新手上路

积分
130
发表于 2025-11-13 23:43:53 | 显示全部楼层
笑不活了,评论区比正文还精彩!
工控课堂 www.gkket.com

0

主题

106

回帖

297

积分

注册会员

积分
297
发表于 2025-11-14 16:26:50 | 显示全部楼层
理性围观,感觉大家说得都有道理
工控课堂 www.gkket.com

0

主题

80

回帖

121

积分

新手上路

积分
121
发表于 2025-11-14 16:42:46 | 显示全部楼层
求个链接 / 教程,楼主好人一生平安~
工控课堂 www.gkket.com

0

主题

78

回帖

121

积分

新手上路

积分
121
发表于 2025-11-14 16:43:01 | 显示全部楼层
这逻辑绝了,分析得太到位了吧
工控课堂 www.gkket.com

0

主题

69

回帖

109

积分

新手上路

积分
109
发表于 2025-11-14 16:43:06 | 显示全部楼层
水贴也要有仪式感,我先来打卡~
工控课堂 www.gkket.com

0

主题

1672

回帖

4321

积分

金牌会员

积分
4321
发表于 2025-11-14 16:48:58 | 显示全部楼层
来凑个热闹,增加点人气~
工控课堂 www.gkket.com

0

主题

67

回帖

116

积分

新手上路

积分
116
发表于 2025-11-14 16:57:47 | 显示全部楼层
同款经历!简直是世另我
工控课堂 www.gkket.com

0

主题

85

回帖

127

积分

新手上路

积分
127
发表于 2025-11-14 17:04:49 | 显示全部楼层
这波反向操作,我属实没想到!
工控课堂 www.gkket.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|手机版|免责声明|本站介绍|工控课堂 ( 沪ICP备20008691号-1 )

GMT+8, 2025-12-22 16:17 , Processed in 0.515011 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表