思考:

我们在平时使用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接入相关推荐

  1. java agent简介

    java agent简介 主要就是两种,一种的方法是premain,一种是agentmain.这两种的区别是: premain是在jvm启动的时候类加载到虚拟机之前执行的 agentmain是可以在j ...

  2. 常用注解[spring 的 java 配置] ||springboot 热部署

    常用注解[spring 的 java 配置] 回顾学过的 spring 的注解 @Controller @RestController @Service @Repository @Component ...

  3. 自动部署java项目,热部署方式

    大部分内容转自:https://www.cnblogs.com/hdwang/p/6081994.html 怎么创建项目不赘述了,不会的也不用往下看了,热部署不需要重启tomcat 说下安装插件 上述 ...

  4. Java Agent简介及使用Byte Buddy和AspectJ LTW监控方法执行耗时

    1.什么是Java Agent Java Agent提供了一种在加载字节码时,对字节码进行修改的方法.一共有两种方式执行:一种是在main方法执行之前,通过premain来实现:另一种是在程序运行中, ...

  5. 使用spring-loaded开源项目,实现java程序和web应用的热部署

    2019独角兽企业重金招聘Python工程师标准>>> JDK1.5之后提供了java.lang.instrument.Instrumentation,即java agent机制能够 ...

  6. idea+tomcat实现热部署-修改java代码及时生效

    前言: 实现效果,修改java后端代码不必重启tomcat,实现热部署. (修改保存代码,要等几秒钟就可以生效了,我这边大概5s) 此文章也是在我测试完全没问题之后,回想我的配置过程所写的文章. 一. ...

  7. SpringBoot热部署方案

    几种热部署方案 SpringBoot dev tool HotSwapAgent JRebel 阿里的arthas 美团的sonic(不公开) IDEA中使用 HotSwap agent 实现热部署 ...

  8. Spring Boot 开发环境热部署(HotSwap)详解

    前言 Spring Boot 提出了多项开箱即用的功能特性,但归根到底还是围绕简化应用的创建.开发.运行.开发环境下我们经常对项目代码进行变动,如果每次都重新启动应用会浪费我们大量时间,为此就产生了多 ...

  9. 【Java综合专栏】「引领序幕」全链路追踪原理之Java Agent探针的技术介绍(上篇)

    前提概要 Java调式.热部署.JVM背后的支持者Java Agent: 各个 Java IDE 的调试功能,例如 eclipse.IntelliJ : 热部署功能,例如 JRebel.XRebel. ...

最新文章

  1. 零基础学习python爬虫_教你零基础如何入门Python爬虫!
  2. ORACLE 几个我忍了他很多年的问题
  3. 黑盒测试方法_黑盒测试方法 收集
  4. centos7 pe系统安装_老毛桃WinPE以ISO镜像模式安装CentOS7
  5. 对老赖 绝不要忍 !一位美女程序媛的讨薪经历...
  6. 第 2 节:前端面试指南 — HTML篇
  7. 9.特殊权限 软连接 硬链接
  8. 等比例缩放图片-opencv
  9. Spring Boot中扩展XML请求和响应的支持
  10. Java的tomcat的配置_java-Tomcat配置
  11. 每日算法系列【LeetCode 684】冗余连接
  12. 【读书心得】 高质量C++/C编程指南-林锐
  13. QML用openGL渲染NV12
  14. VMware vSphere 6 序列号大全
  15. 缠论108课_缠论108课学习顺序
  16. Unity横版过关游戏,敌人的触发、激活问题
  17. Fluent Mybatis 牛逼
  18. JXTA技术手册学习--------(1)通告
  19. CentOS 下安装 7z
  20. Hibernate中使用左外连接

热门文章

  1. 开始→运行→输入的命令集锦(欢迎补充)
  2. 升级鸿蒙系统好不好用,昨天随手发了一个有关升级鸿蒙系统后的使用体会,没料到引发这么大的讨论。看来大家对这个话题关注度很高。作为一个普通消费者,... - 雪球...
  3. 数据库加密sqlite3
  4. 华为mate40Android,【猫哥爆料】史上最强Mate40官宣,坐实年度安卓机皇!
  5. 2017艾普兰机智云全家福
  6. TCP与UDP协议初步学习——网络环境中分布式进程通信的基本概念
  7. 让女人60岁都不涨皱纹的秘籍
  8. h1z1最新消息服务器,h1z1服务器在哪 | 手游网游页游攻略大全
  9. 高度自律学习者的app
  10. UEFI开发探索11 – 鼠标前传