阿里Arthas(阿尔赛斯)不停机替换class进行热部署

arthas在线改代码 一、背景 很久之前就有一个想法:如果部署在线上的代码在遇到类似空指针异常时能自动修复就好了。前段时间准备尝试落实这个想法。那就先从基础做起:先在线改代码吧!本来我是在学习字节码的,偶尔搜了一下资料,发现Arthas这个工具,能够实现代码热修改。我仿佛发现了新大陆,于是添加收藏。这时我发现,我的收藏夹里很早就收藏了这个网页。看来有些路终究是要走的。废话不说,试试吧! 二、开始 1、启动springboot项目 2、运行arthas,并选择目标进程 我这里选择2java -jar arthas-boot.jar 阅读详情

1.启动待测试的应用程序

[doda@host166 game]$ java -jar math-game.jar 

2.替换操作步骤 

2.1启动Arthas

[doda@host166 arthas]$ java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.6.1
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 316194 org.elasticsearch.bootstrap.Elasticsearch
  [2]: 105913 smart-spark-1.0.jar
  [3]: 164109 math-game.jar
3
[INFO] arthas home: /home/doda/shangeshishi/arthas
[INFO] Try to attach process 164109
[INFO] Attach process 164109 success.
[INFO] arthas-client connect 127.0.0.1 3658
  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.                           
 /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'                          
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.                          
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |                         
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'                          

wiki       https://arthas.aliyun.com/doc                                        
tutorials  https://arthas.aliyun.com/doc/arthas-tutorials.html                  
version    3.6.1                                                                
main_class                                                                      
pid        164109                                                               
time       2022-05-15 15:33:34  

2.2使用redefine命令替换的类进行反编译替换操作(不可还原)

 #jad反编译出java文件,只显示源码,最后是文件反编译之后的存放路径
[arthas@151998]$ jad --source-only demo.MathGame > /home/doda/shangeshishi/arthas/game/MathGame.java
#修改反编译出来的java文件
[doda@host166 game]$ vi MathGame.java
#sc全称-search class,-d表示detail,获取类加载器classLoaderClass的hashCode编码
[arthas@164109]$ sc -d *MathGame | grep classLoader
 classLoaderHash   42a57993
#用指定的classloader重新将类在内存中编译,生成.class文件到本地
[arthas@164109]$ mc -c 42a57993 /home/doda/shangeshishi/arthas/game/MathGame.java -d /home/doda/shangeshishi/arthas/game
Memory compiler output:
/home/doda/shangeshishi/arthas/game/demo/MathGame.class
Affect(row-cnt:1) cost in 970 ms.
#用redefine命令将本地编译后的.class类加载到JVM
 [arthas@164109]$ redefine  /home/doda/shangeshishi/arthas/game/demo/MathGame.class
redefine success, size: 1, classes:
demo.MathGame

替换class前后日志对比,代码添加的:System.out.println("出异常信息了!!!");已经马止打印出来,可见替换class已经成功了!

注意:如果mc编译中报下面错误,即有可能是使用openJdk,此jdk中缺少tool工具包,请临时引入完整jdk,用当前引入的jdk,然后重启应用和Arthas,即可解决:
Memory compiler error, exception message: Can not load JavaCompiler from javax.tools.ToolProvider#getSystemJavaCompiler(), please confirm the application running in JDK not JRE., please check $HOME/logs/arthas/arthas.log for more details.
[doda@host166 arthas]$ export JAVA_HOME=/home/doda/shangeshishi/jdk/jdk1.8.0_131
[doda@host166 arthas]$ export PATH=$JAVA_HOME/bin:$PATH
[doda@host166 arthas]$ export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
[doda@host166 arthas]$ java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

2.3使用retransform实现redefine替换(可还原)

2.3.1替换操作

[doda@host166 arthas]$ java -jar arthas-boot.jar
[arthas@164109]$  sc -d *MathGame | grep classLoader
 classLoaderHash   42a57993
[arthas@164109]$ mc -c 42a57993 /home/doda/shangeshishi/arthas/game/MathGame.java -d /home/doda/shangeshishi/arthas/game
Memory compiler output:
/home/doda/shangeshishi/arthas/game/demo/MathGame.class
Affect(row-cnt:1) cost in 310 ms.
[arthas@164109]$ retransform /home/doda/shangeshishi/arthas/game/demo/MathGame.class
retransform success, size: 1, classes:
demo.MathGame

修改替换后的日志如下:

2.3.2retransform常用操作命令

查看 retransform entry,替换多少次显示多少次
[arthas@164109]$ retransform -l
Id              ClassName       TransformCount  LoaderHash      LoaderClassName 
1               demo.MathGame   1               null            null            
2               demo.MathGame   1               null            null            

删除指定id的 retransform entry
[arthas@164109]$ retransform -d 1
[arthas@164109]$ retransform -l
Id              ClassName       TransformCount  LoaderHash      LoaderClassName 
2               demo.MathGame   1               null            null 

删除所有 retransform entry
[arthas@164109]$ retransform --deleteAll

2.3.3消除 retransform 的影响,即还原替换前的class(使用redefine不可还原)

删除这个类对应的 retransform entry
重新触发retransform
对于同一个类,当存在多个 retransform entry时,如果显式触发 retransform ,则最后添加的entry生效(id最大的)

[arthas@164109]$ retransform --deleteAll
[arthas@164109]$ retransform --classPattern demo.MathGame

删除后,显式触发 retransform,可以还原原来的class,显示日志如下:

3.redefine和retransform替换class限制

        都不允许新增加field/method。
        正在跑的函数,没有退出都不能生效,比如下面新增加的System.out.println,只有run()函数里的会生效。

public class MathGame {
    public static void main(String[] args) throws InterruptedException {
        MathGame game = new MathGame();
        while (true) {
            game.run();
            TimeUnit.SECONDS.sleep(1);
            // 这个不生效,因为代码一直跑在 while里
            System.out.println("in loop");
        }
    }
 
    public void run() throws InterruptedException {
        // 这个生效,因为run()函数每次都可以完整结束
        System.out.println("call run()");
        try {
            int number = random.nextInt();
            List<Integer> primeFactors = primeFactors(number);
            print(number, primeFactors);
 
        } catch (Exception e) {
            System.out.println(String.format("illegalArgumentCount:%3d, ", illegalArgumentCount) + e.getMessage());
        }
    }

【arthas系】java语言项目如何不停机替换生产某一个class类 先简单介绍下文章中使用是springboot项目,采用的工具是arthas关于arthas的命令、以及官网地址这里贴以下出来这里先说明下,arthas有在线反编译class文件()->修改源文件->重新编译() 这样的流程来修改文件。这里在网上找到一篇对应这个流程的但是基本上重新编译这个操作很少成功。所以我这边直接选择使用完成的。 阅读详情

相关推荐

arthas,热更新class

tmp/Test.java 为反编译后Java文件存储位置。热更新只会更新jvm内存,不影响原jar 和 war.com.Test 为class路径。

qq_31436465的博客 762

Arthas热部署

arthas热部署

m0_46647162的博客 3010

PWM(脉宽调制)技术详解:从基础到应用实践示例

PWM(脉宽调制)技术是嵌入式系统中一项重要的控制技术,通过调节脉冲宽度来实现对模拟设备的精准控制。从LED亮度到电机速度,PWM的应用场景非常广泛。对于嵌入式学习者来说,理解PWM的工作原理、掌握其配置方法,不仅能提升编程能力,还能为更多复杂系统的开发打下坚实的基础。

SpringWJN的博客 6334

【基础篇】八、Arthas实现热部署

修改java文件的源码,这里容器对应镜像的基础镜像是OpenJDK,没有vi,我先退出阿尔萨斯,cp到hostPath再编辑。因为编译一个类可能需要其他import的类,此时可先查找下这个类的加载器的hash码:sc -d类全名。所以,用阿尔萨斯热更新,只是一种应急的手段,比如CICD线出问题了,平时还是正常编译、打包、部署。背景:修复了一个小bug,比如更改了一行代码,嫌弃重新打包部署太慢,想尽快看到效果。这种方式只是将字节码信息更新到了内存中,程序重启,字节码还是会恢复成就的。

llg___的博客 5324

深入解析DMR协议中的4-CPFSK调制技术与实现

本文深入解析了DMR协议中采用的4-CPFSK调制技术。该技术凭借其连续相位、恒包络的特性,在有限的12.5kHz信道带宽内实现了稳健的通信,有效对抗干扰并提升功放效率,是DMR数字对讲机清晰、稳定通信的核心保障。文章详细阐述了其原理、实现细节及在协议栈中的协同作用。

weixin_29306875的博客 232

Unity事件总线第一篇:为什么你的游戏需要一个事件总线?

本文探讨了游戏开发中常见的跨模块调用导致代码强耦合的问题。通过一个攻击按钮触发角色攻击、怪物掉血和血条更新的案例,分析了直接调用方式带来的维护困难、扩展性差和模块重用性低等弊端。文章提出使用事件总线(Event Bus)作为解决方案,通过发布-订阅模式实现模块解耦。重构后的代码中,各模块只需与事件总线交互,彼此不再直接依赖。这种设计使得新增功能(如音效)无需修改现有代码,大大提高了系统的可维护性和扩展性,同时增强了模块的重用性,完美体现了开闭原则。

qq_46348216的博客 1300

Arthas(阿尔萨斯)-热部署

执行:redefine -c 31221be2 /shenbaoTest/TaxSdsCommonQcServiceImpl.class。3、精准找到已加载的类 sc -d (TaxSdsCommonQcServiceImpl找到这个类的位置)4、找到 classLoaderHash ,取其后边的值(31221be2)注意:测试环境加载的class文件放上生产的话,两个环境jdk版本必须一致。0、将本地编译好的需要修改的.class文件上传到服务器特定位置。文件,覆盖 JVM 已加载的类,

m0_50043153的博客 1721

大连理工大学中文情感词汇本体库(含情绪分析代码)

中文文本数据的情绪计算昨天如何对微博推文进行情绪分析(细粒度情感分析)介绍了英文的NRC情绪词典。虽然支持中文,但由于制作问题,导致并不完全适应中文场景。今天介绍大连理工大学中文情感...

大邓和他的Python 4万+

arthas热替换java中的class文件

arthas热替换java中的class文件

ronshi的博客 2407

【通信协议】GATT 与 BLE HID 工作原理详解

详细介绍BLE HID 跟GATT工作原理与两者的交互关系

以实战经验介绍行业知识 845

SAP ABAP Cloud 发展简史

其中用于云开发的 ABAP,官方术语是 「ABAP in the Cloud」,本文后续叙述方便起见,简称为 「ABAP Cloud」. 它涵盖了标准 ABAP 语言范围的一个子集,只能访问受限的 API,用于构建 SAP BTP ABAP 环境以及 SAP S/4HANA Cloud ABAP 环境上的云解决方案。SAP ABAP 平台是用于 SAP ECC、SAP S/4HANA 和 SAP BTP 等产品的技术平台,也是 ABAP 应用程序的开发和运行环境。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1394

Arthas热替换class文件

arthas神器生产环境不停服务,紧急修复问题

fengchengwu2012的博客 7749

《大数据之路:阿里巴巴大数据实践》-第1篇 数据技术篇 -第3章数据同步

我们将数据釆集分为日志采集和数据库数据同步两 部分。数据同步技术更通用的含义是不同系统间的数据流转,有多种不 同的应用场景。主数据库与备份数据库之间的数据备份,以及主系统与 子系统之间的数据更新,属于同类型不同集群数据库之间的数据同步。 另外,还有不同地域、不同数据库类型之间的数据传输交换,比如分布 式业务系统与数据仓库系统之间的数据同步。对于大数据系统来说,包 含数据从业务系统同步进入数据仓库和数据从数据仓库同步进入数据 服务或数据应用两个方面。本章侧重讲解数据从业务系统同步进入数据 仓库这个环节,但其适

m0_54252387的博客 962

热部署在项目中的应用

开发效率提升

qq_39408435的博客 1940

交通仿真软件:SUMO_(1).SUMO基础知识

SUMO 中的交通网络由节点(junctions)和边(edges)组成。节点表示交叉口或路网的连接点,边表示连接节点之间的道路。节点:节点文件(.nod.xml)定义了网络中的所有节点。每个节点有一个唯一的 ID 和坐标。</边:边文件(.edg.xml)定义了连接节点的边。每个边有一个唯一的 ID、起点节点 ID 和终点节点 ID。</车辆文件(.vtype.xml)定义了不同类型的车辆。每个车辆类型可以有不同的参数,例如长度、最大速度、加速度等。</

kkchenjj的博客 1433

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

阿里云的Arthas(阿尔萨斯)

监控变量或表达式的变化,例如 watch com.example.YourClass setYourVariable 'System.out.println("YourVariable updated to: " + $1)'。: 跟踪方法的调用,例如 trace com.example.YourClass YourMethod 'print("Method called with args: " + Arrays.toString(args))'。: 输出线程堆栈信息,例如 tdump。

宽带你的世界 2412

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

面试官:怎样使用arthas进行热部署,解决线上问题?

idea提示是否要重启SpringBoot,这个时候直接点Cancel,取消。如果重启了就会导致新的代码被加载到新进程啦。总的来说,arthas 热部署可以提高开发和调试的效率,快速定位和解决线上问题,以及优化应用的性能。这时候我们可以再使用jad来看这个类的情况,会发现还是原来的代码,Hello World!加载外部的.class文件,retransform jvm 已加载的类。然后开始使用retransform来热部署新的class文件。我们可以看到,对应的代码被我们重新加载啦。或者使用mc进行编译。

java_beautiful的博客 720

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

arthas热部署

更详细步骤arthas热部署文件时,需要找到.java文件对应的.class文件,如何通过快捷键快速定位一个.java文件对应的.class文件。

qq_44137046的博客 810

arthas 线上修改代码(免重启)

arthas 线上修改代码 而且不需要重启。

l23456789o的博客 2532

arthas修改运行中的java代码

以下环境是在windows环境中,测试学习用,项目很简单,一个SpringBoot项目,定义了一个接口,返回字符串。用arthas工具修改代码。

峰晨的博客 2062

Arthas(阿尔萨斯)使用手册

虽然Arthas也有Windows版本的,但是服务一般都是放在linux服务器上,所以主要记录下linux版本的安装。下载,然后用的方式启动: 完成安装。就是这么简单。arthas日志输出是默认关闭的,需要主动开启,开启步骤(前提需要启动Arthas) 如图所示,表示已开启。日志的路径一般都root/logs/arthas-cache/result.log 如果不在这个路径下,可以通过find命令查找,命令如下 之所需要打开保存日志,一方面是线上请求众多,控制台日志一下子就会跳过去,不容易捕获、..

qq_38377190的博客 1万+

1分钟学会Arthas代码热部署

一 Arthas简介 Arthas是阿里巴巴开源的Java程序诊断工具。 https://alibaba.github.io/arthas/install-detail.html 二 代码热部署 2.1 1分钟教程 遇到线上问题无法debug,只能加log重新发布吗? 线上代码为什么没有执行到这里,是没有commit还是分支搞错了? 线上某个用户的数据有问题,测试环境无法复现,怎么办? Art...

Admire_an的专栏 5554

阿里热部署工具arthas简单使用

阿里热部署工具arthas简单使用,容器热部署,生产修复

baidu_33378510的博客 909

阿里 Arthas (阿尔萨斯)工具的使用

结论:arthas 可以通过启动时指定不同的端口来监听不同的java程序,每次如果采用exit或者quit退出,都会保留实例,下次可以通过指定上次相同的端口,进入同一个实例,但是进入同一个实例,只能再次监听同一个java程序,不能使用同一个实例两次监听不同的程序,会报错端口冲突,告诉你三种解决办法;③通过java -jar arthas-boot.jar再次进入,因为没有指定监听的端口号,所以跟上一次共用的同一个session,也就是监听的25985的进程。③再次查看3658端口占用情况,发现未被占用了;

java领域分享 4802

使用Arthas热更新类(热部署不需要重启服务)

以某个界面为例 找到程序Action层或者Controller层 类的全路径: com.ailk.openbilling.ams.action.freeResourceQuery.FreeResourceQueryActionImp 要观察的方法名: queryFreeRes 1、热更新类 更新前: (1)、将要反编译的文件 反编译到指定目录 命令: jad com.ailk.openbilling.ams.action.freeResourceQuery.FreeResourceQueryAction

cz1803472613的博客 3060
上一篇: 阿里Arthas(阿尔赛斯)-java诊断工具使用入门
下一篇: Linux服务器上传 .class用base64加密,转换文件到服务器的技巧
SimpleSimpleSimples
博客等级 码龄10年 6451粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值