专栏首页芋道源码1024如何热更新线上的 Java 服务器代码

如何热更新线上的 Java 服务器代码

来源:未分配微服务

cnblogs.com/orange911/p/10583245.html

  • 一、前言
  • 二、Arthas的使用
  • 三、热更新

一、前言

1、热更新代码的场景

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

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

二、Arthas的使用

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

1、下载启动Arthas

wget https://alibaba.github.io/arthas/arthas-boot.jar
java -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、更新完毕不出意外会立即生效,这时候就可以去验证代码是否生效了



生活很美好,明天见(。・ω・。)ノ♡

本文分享自微信公众号 - 芋道源码(javayuanma)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 芋道 Spring Boot JPA 入门(三)之基于注解查询

    虽然 Spring Data JPA 提供了非常强大的功能,可以满足绝大多数业务场景下的 CRUD 操作,但是可能部分情况下,我们可以使用在方法上添加 org....

    芋道源码
  • Java 依然免费,JDK11 请放心使用

    Java 依然非常稳健,并且在 TIOBE 10 月的语言排行版,处于第一,毫无悬念。

    芋道源码
  • Apollo 源码解析 —— Portal 认证与授权(二)之授权

    本文接 《Apollo 源码解析 —— Portal 认证与授权(一)之认证》 ,侧重在授权部分。在上一文中,我们提到:

    芋道源码
  • Web前端学习 第3章 JavaScript基础教程12 函数进阶

    在此前的内容中,我们已经学习了函数的基本用法,例如如何定义函数,如何调用函数,以及函数的形参、实参、返回值等内容。本节内容会继续讲解ES2015为函数赋予的新特...

    学习猿地
  • python多线程学习笔记(超详细)

    python threading 多线程 一. Threading简介 首先看下面的没有用Threading的程序 import threading,time ...

    marsggbo
  • Python实现小数的二进制与十进制形式转换

    对于十进制小数,乘以2,取整数部分,对剩余的小数部分重复这个过程,直至小数为0,把得到的整数部分依次保存,即为转换结果。例如,十进制小数0.125转换为二进制小...

    Python小屋屋主
  • Lua函数的冒号调用和点调用

    冒号定义函数中的self指向函数所属表对象,即self是table类型,通过self表可以:访问挂载在该表下的所有冒号定义函数 如,有定义A={},A:b()...

    bering
  • 实验三 序列数据处理程序设计

    2、掌握字符串的输入和输出,会使用切片的方式访问字符串中的值,掌握常见的字符串的内建函数。

    背雷管的小青年
  • CTP 看穿式监管版本,收集信息为什么会失败?

    就此我先询问了 CTP 官方交流群,官方给出的解答是,需要链接新的信息采集的库 WinDataCollect。

    JIFF
  • Python numpy函数:dot()

    py3study

扫码关注云+社区

领取腾讯云代金券