CN109460243A - 一种基于Agentmain的生产环境在线类替换方法 - Google Patents
一种基于Agentmain的生产环境在线类替换方法 Download PDFInfo
- Publication number
- CN109460243A CN109460243A CN201811211358.3A CN201811211358A CN109460243A CN 109460243 A CN109460243 A CN 109460243A CN 201811211358 A CN201811211358 A CN 201811211358A CN 109460243 A CN109460243 A CN 109460243A
- Authority
- CN
- China
- Prior art keywords
- agentmain
- class
- production environment
- environment based
- online
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Computer Security & Cryptography (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明涉及一种基于Agentmain的生产环境在线类替换方法,采用Java虚拟机底层技术Agentmain实现,与业务无耦合,跟业务方案无关,在上线后可以根据实际需要来更新替换类,具有很高的灵活性,并且不需要重新定义类加载器,不存在内存泄露风险。由于不需要在业务开发阶段就进行设计,而是采用了虚拟机的底层技术,因此也可以很好的运用于老旧系统,具有很好的推广性。
Description
技术领域
本发明涉及Java应用工程领域,特别是一种基于Agentmain的生产环境在线类替换方法。
背景技术
在Java应用工程领域,如何在不停机、低用户感知,甚至用户无感知的情况下进行类的热替换从而升级系统或者修复系统Bug一直是难以解决的问题,特别是在生产环境上进行类的替换更是如此。
Java虚拟机对于类加载采用双亲加载机制,已经加载过一次的类,无论后续如何修改类都无法对线上系统生效,若要生效只能重启虚拟机,但对于一个运行的线上生产系统来说,重启意味着暂停服务,用户检验极差,极易造成重大损失。
在Java应用工程中,类的加载采用双亲委派机制。当应用中需要使用类时,由当前类加载器接收加载类的请求,首先将加载任务委托给其父类加载器,如果该父类加载器还有祖先类加载器,依次递推加载,如果祖先加载器可以完成类加载任务,就返回加载的类对象,否则由当前加载器自己去加载。此种类加载过程可以避免对一个类的重复加载,但也导致了一个类一旦被加载就无法改变的问题。
针对上述问题现有技术方案通常采用自定义的类加载器的技术来解决。自定义类加载器监听需要改变的类或者由系统主动触发,在编译文件发生改变的时候,重新加载该类,并且需要改变创建对象的行为。在使用可能改变的类时候,必需使用自定义的类加载器来重新加载类的编译文件。在应用的设计阶段就要并行设计需要更新的类,在业务代码中进行分类,哪些是可能改变的类,哪些是不变的类,并且一旦做出决定在后续开发中就要遵守这个规则不能改变,否则就需要返工代码。由此可以看出,该解决方案需要额外的工作量,缺乏灵活性,并且类的每次修改都需要重新生成加载器存在内存泄露的风险。
从上述描述的解决过程可以看出自定义类加载器技术存在以下不足,首先,同一个类加载器还是无法加载两个相同类名的类,对于每次修改都需要新增加载器来加载类,对于更新升级频繁的应用存在内存泄漏的风险;其次,在应用的设计开发阶段不仅要进行业务方案的设计开发,更要并行的进行更新类方案的设计开发,这极大增加工作量,并且更新代码与业务代码紧密耦合、侵入性大,缺乏灵活性;最后,对于已经运行未进行更新设计的老旧系统无法运用,难以推广。
发明内容
有鉴于此,本发明的目的是提出一种基于Agentmain的生产环境在线类替换方法,可以在不重启系统的前提下,让系统能感知到Java编译文件的变化,更改类的行为,从而达到升级系统或者修复系统Bug的目的。
本发明采用以下方案实现:一种基于Agentmain的生产环境在线类替换方法,包括以下步骤:
步骤S1:在Java环境中创建AgentMain更新机制,所述AgentMain更新机制包括Agent组件以及关联组件,其中Agent组件包括Agentmain拦截以及ClassFileTransformer;
步骤S2:所述Agent组件在应用程序入口main方法之前,通过方法切面拦截的方式添加Agentmain方法,所述Agentmain方法能够在类加载前修改类的编译文件字节码。
进一步地,所述ClassFileTransformer的接口根据实现情况自定义实现方式以满足不同的类加载方式,不需要重新定义类加载器,不会产生内存垃圾而造成内存泄露。
进一步地,所述AgentMain更新机制是独立于业务系统应用程序来运行的,与真正的业务代码完全解耦,通过所述关联组件将Agent组件插入到应用程序与虚拟机之间来拦截应用程序的类加载行为。
进一步地,所述关联组件包括Attacher以及Java虚拟机B。
进一步地,对于已经存在的线上系统,单独部署一套AgentMain更新方案来更新老旧系统的类行为。
与现有技术相比,本发明有以下有益效果:
1、本发明的AgentMain更新机制不需要重新定义类加载器,不会产生内存垃圾而造成内存泄露。
2、本发明的AgentMain更新机制是独立于业务系统应用程序来运行的,与真正的业务代码完全解耦,可根据实现业务需求灵活配置。
3、本发明的AgentMain更新方案可以更新老旧系统的类行为,具有很好的通用性,具备一次开发到处适配的特性。
附图说明
图1为本发明实施例的原理框图。
具体实施方式
下面结合附图及实施例对本发明做进一步说明。
应该指出,以下详细说明都是示例性的,旨在对本申请提供进一步的说明。除非另有指明,本文使用的所有技术和科学术语具有与本申请所属技术领域的普通技术人员通常理解的相同含义。
需要注意的是,这里所使用的术语仅是为了描述具体实施方式,而非意图限制根据本申请的示例性实施方式。如在这里所使用的,除非上下文另外明确指出,否则单数形式也意图包括复数形式,此外,还应当理解的是,当在本说明书中使用术语“包含”和/或“包括”时,其指明存在特征、步骤、操作、器件、组件和/或它们的组合。
如图1所示,本实施例提供了一种基于Agentmain的生产环境在线类替换方法,包括以下步骤:
步骤S1:在Java环境中创建AgentMain更新机制,所述AgentMain更新机制包括Agent组件以及关联组件,其中Agent组件包括Agentmain拦截以及ClassFileTransformer;
步骤S2:所述Agent组件在应用程序入口main方法之前,通过方法切面拦截的方式添加Agentmain方法,所述Agentmain方法能够在类加载前修改类的编译文件字节码。
在本实施例中,所述ClassFileTransformer的接口根据实现情况自定义实现方式以满足不同的类加载方式,不需要重新定义类加载器,不会产生内存垃圾而造成内存泄露。
在本实施例中,所述AgentMain更新机制是独立于业务系统应用程序来运行的,与真正的业务代码完全解耦,通过所述关联组件将Agent组件插入到应用程序与虚拟机之间来拦截应用程序的类加载行为。
在本实施例中,所述关联组件包括Attacher以及Java虚拟机B。
在本实施例中,对于已经存在的线上系统,单独部署一套AgentMain更新方案来更新老旧系统的类行为。
具体的,本实施例的具体实现步骤如下:
步骤1、定义一个MANIFEST.MF文件,文件中必须包含Agent-Class。
例如:
Manifest-Version:1.0
Can-Redefine-Classes:true
Agent-Class:com.linewell.agent.AgentMainTraceAgent
Can-Retransform-Classes:true
步骤2、创建Agent-Class指定的AgentMainTraceAgent类,该类必须包含agentmain方法;创建真正实现类编译文件替换的实现类SimpleClassFileTransformer。
例如:
在agentmain中调用了Instrumentation实例,执行了inst.retransformClasses(Business.class)来转换目标类,也就是Business类。注意,Instrumentation中还有一个类似的方法redefineClasses,这个方法是在类第一次加载时使用,如果要在类加载后生效则需要使用retransformClasses方法。SimpleClassFileTransformer简单的实现了ClassFileTransformer接口的transform方法,该方法返回了新的业务类Business的class字节数组。ClassFileTransformer的生效周期与虚拟机相同,在类加载器加载编译文件的时候都会进行拦截。
步骤3、将MANIFEST.MF和Agent类打成jar包。
例如:javaagent.jar
步骤4、将javaagent.jar包载入应用系统虚拟机。
例如:
本实施例基于Agentmain的在线类替换方案的架构如图1所示。Agent组件在应用程序入口main方法之前,通过方法切面拦截的方式添加agentmain方法,此方法可以在类加载前修改类的编译文件字节码。无论是首次加载,还是每次更新完类进行旧类的替换,都会经过ClassFileTransformer的transform方法,也就是说,真正重新加载类的逻辑可以在transform这个方法中实现,本实施例方案正是利用这个特性来达到更新类的目的。在AgentMain更新机制中,Agent组件中的ClassFileTransformer接口需要根据实现情况自定义实现方式以满足不同的类加载方式,不需要重新定义类加载器,不会产生内存垃圾而造成内存泄露。AgentMain更新机制是独立于业务系统应用程序来运行的,与真正的业务代码完全解耦,通过关联组件将Agent组件插入到应用程序与虚拟机之间来拦截应用程序的类加载行为。对于已经存在的线上系统,可以单独部署一套AgentMain更新方案来更新老旧系统的类行为,并且此方案具有很好的通用性,方便移植,通过简单配置就能够推广到其它系统。
本实施例采用Java虚拟机底层技术Agentmain实现,与业务无耦合,跟业务方案无关,在上线后可以根据实际需要来更新替换类,具有很高的灵活性,并且不需要重新定义类加载器,不存在内存泄露风险。由于不需要在业务开发阶段就进行设计,而是采用了虚拟机的底层技术,因此也可以很好的运用于老旧系统,具有很好的推广性。
以上所述仅为本发明的较佳实施例,凡依本发明申请专利范围所做的均等变化与修饰,皆应属本发明的涵盖范围。
Claims (5)
1.一种基于Agentmain的生产环境在线类替换方法,其特征在于:包括以下步骤:
步骤S1:在Java环境中创建AgentMain更新机制,所述AgentMain更新机制包括Agent组件以及关联组件,其中Agent组件包括Agentmain拦截以及ClassFileTransformer;
步骤S2:所述Agent组件在应用程序入口main方法之前,通过方法切面拦截的方式添加Agentmain 方法,所述Agentmain方法能够在类加载前修改类的编译文件字节码。
2.根据权利要求1所述的一种基于Agentmain的生产环境在线类替换方法,其特征在于:所述ClassFileTransformer的接口根据实现情况自定义实现方式以满足不同的类加载方式,不需要重新定义类加载器,不会产生内存垃圾而造成内存泄露。
3.根据权利要求1所述的一种基于Agentmain的生产环境在线类替换方法,其特征在于:所述AgentMain更新机制是独立于业务系统应用程序来运行的,与真正的业务代码完全解耦,通过所述关联组件将Agent组件插入到应用程序与虚拟机之间来拦截应用程序的类加载行为。
4.根据权利要求2所述的一种基于Agentmain的生产环境在线类替换方法,其特征在于:所述关联组件包括Attacher以及Java虚拟机B。
5.根据权利要求1所述的一种基于Agentmain的生产环境在线类替换方法,其特征在于:对于已经存在的线上系统,单独部署一套AgentMain更新方案来更新老旧系统的类行为。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811211358.3A CN109460243A (zh) | 2018-10-17 | 2018-10-17 | 一种基于Agentmain的生产环境在线类替换方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811211358.3A CN109460243A (zh) | 2018-10-17 | 2018-10-17 | 一种基于Agentmain的生产环境在线类替换方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN109460243A true CN109460243A (zh) | 2019-03-12 |
Family
ID=65607894
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811211358.3A Pending CN109460243A (zh) | 2018-10-17 | 2018-10-17 | 一种基于Agentmain的生产环境在线类替换方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109460243A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111400135A (zh) * | 2020-03-13 | 2020-07-10 | 普信恒业科技发展(北京)有限公司 | 一种业务数据的提取方法及装置 |
CN112181470A (zh) * | 2020-09-22 | 2021-01-05 | 京东数字科技控股股份有限公司 | 一种部署补丁的方法和装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104391787A (zh) * | 2014-11-13 | 2015-03-04 | 华为软件技术有限公司 | 一种针对目标方法的监控、热切入方法及装置 |
EP2881881A2 (en) * | 2013-12-05 | 2015-06-10 | McAfee, Inc. | Detecting java sandbox escaping attacks based on java bytecode instrumentation and java method hooking |
CN106406828A (zh) * | 2015-07-28 | 2017-02-15 | 阿里巴巴集团控股有限公司 | 一种修改java系统业务工具功能的方法及装置 |
CN108304195A (zh) * | 2017-09-08 | 2018-07-20 | 武汉斗鱼网络科技有限公司 | 一种aop组件的实现方法、装置及电子设备 |
-
2018
- 2018-10-17 CN CN201811211358.3A patent/CN109460243A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP2881881A2 (en) * | 2013-12-05 | 2015-06-10 | McAfee, Inc. | Detecting java sandbox escaping attacks based on java bytecode instrumentation and java method hooking |
CN104391787A (zh) * | 2014-11-13 | 2015-03-04 | 华为软件技术有限公司 | 一种针对目标方法的监控、热切入方法及装置 |
CN106406828A (zh) * | 2015-07-28 | 2017-02-15 | 阿里巴巴集团控股有限公司 | 一种修改java系统业务工具功能的方法及装置 |
CN108304195A (zh) * | 2017-09-08 | 2018-07-20 | 武汉斗鱼网络科技有限公司 | 一种aop组件的实现方法、装置及电子设备 |
Non-Patent Citations (1)
Title |
---|
莫那鲁道: "探秘Java 热部署三(Java agent agentmain)", 《HTTPS://WWW.CNBLOGS.COM/STATEIS0/P/9062201.HTML》 * |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111400135A (zh) * | 2020-03-13 | 2020-07-10 | 普信恒业科技发展(北京)有限公司 | 一种业务数据的提取方法及装置 |
CN112181470A (zh) * | 2020-09-22 | 2021-01-05 | 京东数字科技控股股份有限公司 | 一种部署补丁的方法和装置 |
CN112181470B (zh) * | 2020-09-22 | 2024-05-17 | 京东科技控股股份有限公司 | 一种部署补丁的方法和装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN100489778C (zh) | Java程序可动态更新化实现方法 | |
US8745643B2 (en) | Method and arrangement for re-loading a class | |
CA2290086C (en) | Method for loading a java application program | |
US8010973B2 (en) | Class loader for managing a network | |
Pukall et al. | JavAdaptor—Flexible runtime updates of Java applications | |
US20080005747A1 (en) | System and method for object state management | |
JPH1083308A (ja) | スタブ検索及びローディング・サブシステム、スタブ検索及びローディング方法並びにスタブ検索及びローディング用記録媒体 | |
CN102955714B (zh) | 实现动态模拟远程接口的装置及方法 | |
CN109460243A (zh) | 一种基于Agentmain的生产环境在线类替换方法 | |
CN111949529A (zh) | 系统调试方法、装置、计算机设备和存储介质 | |
CN113254317A (zh) | 基于字节码的指标自动生成方法及系统 | |
Kraemer et al. | Aligning UML 2.0 state machines and temporal logic for the efficient execution of services | |
CN114489585A (zh) | 一种治理功能插件化的微服务开发框架及实现方法 | |
Stankovic et al. | Architecture and object model for distributed object-oriented real-time databases | |
CN105975333A (zh) | 应用程序运行控制的方法及装置 | |
CN106598662A (zh) | 基于android的应用加载方法及装置 | |
EP2606424A2 (en) | System and method for execution of high performance computing applications | |
Felser et al. | Dynamic software update of resource-constrained distributed embedded systems | |
WO2015196524A1 (zh) | 软件升级处理方法、装置、终端及服务器 | |
Almeida | Dynamic reconfiguration of object-middleware-based distributed systems | |
Watkins | Using interface definition languages to support path expressions and programming by contract | |
De Boer et al. | Decidability problems for actor systems | |
Trofin et al. | A Self-Optimizing container design for enterprise java beans applications | |
KR20150137766A (ko) | 가상머신 스택 생성 시스템 및 방법 | |
Zhu et al. | A Domain-Specific Language for Reconfigurable, Distributed Software Architecture |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20190312 |
|
RJ01 | Rejection of invention patent application after publication |