java agent简介热部署SDK接入
思考:
我们在平时使用arthas的类方法监控,类增强,到底是怎么在应用启动后还能对类进行修改的呢,他到底是基于什么场景下孕育出来的呢,今天我们就来聊一聊java-agent,当了解完了agent机制,我相信你就可以完成自己动手写出来一个减配版的arthas了
Java-agent简介
- 使得开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序,甚至能够替换和修改某些类的定义。有了这样的功能,开发者就可以实现更为灵活的运行时虚拟机监控和 Java 类操作了,这样的特性实际上提供了 一种虚拟机级别支持的 AOP 实现方式,使得开发者无需对 JDK 做任何升级和改动,就可以实现某些 AOP 的功能了,了解完这个我们知道了这是JVM提供的一种动态热更新的能力,那么如何才能使用这种强大的能力呢?
Java-agent接入:
java-agent使用1.1:
public class PreMain { … public static void premain(String args, Instrumentation inst) { main(args, inst); } public static void agentmain(String args, Instrumentation inst) { main(args, inst); }….
}
解释:在java 1.5时,在JVM启动时,JVM只会去调用premain,意味着只能在启动时,做类的增强
在1.6后,可以实现agentmain,能支持在启动后,动态修改类的字节编码,所以在调用方法的时候
都要使用inst.rexxx
java-agent使用1.2:
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><executions><execution><configuration>… <descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><manifestEntries><Premain-Class>agent.PreMain</Premain-Class><Agent-Class>agent.PreMain</Agent-Class><Can-Redefine-Classes>true</Can-Redefine-Classes><Can-Retransform-Classes>true</Can-Retransform-Classes>…</manifestEntries></archive></configuration></execution></executions>
</plugin>
解释:上面主要会在manifest文件中写入 agent class,并且具备类的重定义、转化能力,启动后JVM会通过 sun.instrument.InstrumentationImpl#loadClassAndStartAgent来调用Agent-Class,这样会传入对应JVM Instrumentation,此时我们可以通过 inst对类进行transform,redefine等各种操作
java agent使用,图1.2.1
上面的maven xml 配置后的真实效果,就是在manifest文件中写入了这两个地址
具体实现:这是本在周末可实现的热部署的应用,支持快速接入
- 见代码:https://gitee.com/wds/dev-tools
解释:这边只是实现了一个动态代码编译的场景,具体arthas是用动态类增强的原理,具体方案
和这个大同小异,远程socket是基于文件socket连接,并在Instrumentation实现用新的类字节码
替换老字节码,实现动态类加载,大部分类的热部署都是基于这个实现的
AOP和Agent的区别
- 解释:简单的讲AOP生成了一个代理对象,和原对象是属于不同的对象,有着不同的类属性,而agent缺是在内存中直接替换了这个类的元数据,保持与原有类的相同的类结构
实战
第一步:下载arthas 并启动:
curl -L https://arthas.aliyun.com/install.sh | sh && ./as.sh第二步:查找你需要编译类的
classLoadsc -d ${CLASS_NAME} | grep classLoaderHash第三步:可以执行ognl看看你的类的常量(非必须)
ognl -c 50bb346c '@${CLASS_NAME}@CONSTANT_VAR'第三步:反编译你的类,并且不带其他描述信息,然后你可以通过vim 修改反编译后的类
jad --source-only ${CLASS_NAM} > /tmp/${CLASS_NAME}.java第四步:内存编译,这一步有点慢,因为这一步会遍历你所有的依赖的类库,非常耗时,有优化的空间,我在我的SDK已经做了优化,性能有很大的提高
mc -c 50bb346c /tmp/${CLASS_NAME}.java -d /tmp第五步:Instrumentation用编译好的字节码,重新定义已经加载的类
redefine /tmp/${CLASS_NAME}
热部署SDK接入(dev-tools:v0.0.1-SNAPSHOT):
背景:随着应用开发的臃肿,导致一个应用开发重新部署需要30多分钟左右,但是对于微小改动,我们没有必要重新部署,导致特别耗时,影响开发效率,所以在此背景下,我开发了一个可以实现热部署代码的中间件部署编译容器,可以快速编译你的代码,让你不要写代码一分钟,部署一个小时,让你也有时间干干自己的事情,而且支持分布式热部署能力,让你一次部署,分发到各个机器上
本项目鄙人已开源,大家可以去学习,也可以自行修改:https://gitee.com/wds/dev-tools
接入步骤:
第一步:引入开发包
<dependency><groupId>dev.tools</groupId><artifactId>facade</artifactId><version>0.0.1-SNAPSHOT</version>
</dependency>
第二步:实现一个controller
@Controllerpublic class DevToolsController extends SimpleDevToolsController {}
第三步:java自身的tools工具包不要忘记引入
export CLASS_PATH=${CLASS_PATH}:${JAVA_HOME}/lib/tools.jar
启动后访问地址:https://${domain}/dev-tools/index , 这样就可以在这里修改代码,不用再频繁启动应用了
UI页面:
java agent简介热部署SDK接入相关推荐
- java agent简介
java agent简介 主要就是两种,一种的方法是premain,一种是agentmain.这两种的区别是: premain是在jvm启动的时候类加载到虚拟机之前执行的 agentmain是可以在j ...
- 常用注解[spring 的 java 配置] ||springboot 热部署
常用注解[spring 的 java 配置] 回顾学过的 spring 的注解 @Controller @RestController @Service @Repository @Component ...
- 自动部署java项目,热部署方式
大部分内容转自:https://www.cnblogs.com/hdwang/p/6081994.html 怎么创建项目不赘述了,不会的也不用往下看了,热部署不需要重启tomcat 说下安装插件 上述 ...
- Java Agent简介及使用Byte Buddy和AspectJ LTW监控方法执行耗时
1.什么是Java Agent Java Agent提供了一种在加载字节码时,对字节码进行修改的方法.一共有两种方式执行:一种是在main方法执行之前,通过premain来实现:另一种是在程序运行中, ...
- 使用spring-loaded开源项目,实现java程序和web应用的热部署
2019独角兽企业重金招聘Python工程师标准>>> JDK1.5之后提供了java.lang.instrument.Instrumentation,即java agent机制能够 ...
- idea+tomcat实现热部署-修改java代码及时生效
前言: 实现效果,修改java后端代码不必重启tomcat,实现热部署. (修改保存代码,要等几秒钟就可以生效了,我这边大概5s) 此文章也是在我测试完全没问题之后,回想我的配置过程所写的文章. 一. ...
- SpringBoot热部署方案
几种热部署方案 SpringBoot dev tool HotSwapAgent JRebel 阿里的arthas 美团的sonic(不公开) IDEA中使用 HotSwap agent 实现热部署 ...
- Spring Boot 开发环境热部署(HotSwap)详解
前言 Spring Boot 提出了多项开箱即用的功能特性,但归根到底还是围绕简化应用的创建.开发.运行.开发环境下我们经常对项目代码进行变动,如果每次都重新启动应用会浪费我们大量时间,为此就产生了多 ...
- 【Java综合专栏】「引领序幕」全链路追踪原理之Java Agent探针的技术介绍(上篇)
前提概要 Java调式.热部署.JVM背后的支持者Java Agent: 各个 Java IDE 的调试功能,例如 eclipse.IntelliJ : 热部署功能,例如 JRebel.XRebel. ...
最新文章
- 零基础学习python爬虫_教你零基础如何入门Python爬虫!
- ORACLE 几个我忍了他很多年的问题
- 黑盒测试方法_黑盒测试方法 收集
- centos7 pe系统安装_老毛桃WinPE以ISO镜像模式安装CentOS7
- 对老赖 绝不要忍 !一位美女程序媛的讨薪经历...
- 第 2 节:前端面试指南 — HTML篇
- 9.特殊权限 软连接 硬链接
- 等比例缩放图片-opencv
- Spring Boot中扩展XML请求和响应的支持
- Java的tomcat的配置_java-Tomcat配置
- 每日算法系列【LeetCode 684】冗余连接
- 【读书心得】 高质量C++/C编程指南-林锐
- QML用openGL渲染NV12
- VMware vSphere 6 序列号大全
- 缠论108课_缠论108课学习顺序
- Unity横版过关游戏,敌人的触发、激活问题
- Fluent Mybatis 牛逼
- JXTA技术手册学习--------(1)通告
- CentOS 下安装 7z
- Hibernate中使用左外连接
热门文章
- 开始→运行→输入的命令集锦(欢迎补充)
- 升级鸿蒙系统好不好用,昨天随手发了一个有关升级鸿蒙系统后的使用体会,没料到引发这么大的讨论。看来大家对这个话题关注度很高。作为一个普通消费者,... - 雪球...
- 数据库加密sqlite3
- 华为mate40Android,【猫哥爆料】史上最强Mate40官宣,坐实年度安卓机皇!
- 2017艾普兰机智云全家福
- TCP与UDP协议初步学习——网络环境中分布式进程通信的基本概念
- 让女人60岁都不涨皱纹的秘籍
- h1z1最新消息服务器,h1z1服务器在哪 | 手游网游页游攻略大全
- 高度自律学习者的app
- UEFI开发探索11 – 鼠标前传