JAVA探针机制—Agent(一)

agent机制首次出现在JDK5版本,在JDK6版本得到升级并且正式被官方定义为agent原理。

首先要明确JavaAgent是一个JVM层面的插件,他可以利用JDK中的Instrumenttation类,实现对类字节码文件的修改。

而Agent在功能上的实现有两种情况:

  1. 在main方法执行前,调用premain方法。
  2. 在main方法执行后,监控JVM虚拟机的同时,调用agentmain方法。

目前市场上很多日志、热部署、性能监控等等插件功能,都是基于探针中agentmain方法实现的,那么本文就详细的说明下如何自定义去实现一个Agent,Java探针插件功能。

插件

作为一个插件,他是需要我们提前去配置好一个属性的。

Premain-Class:指定代理类
Agent-Class:指定代理类
Boot-Class-PathL:指定bootstrap类加载器的路径
Can-Redefine-Classes:是否重新定义所有类
Can-Retransform-Classes:是否需要retransform函数

假如项目是一个Maven项目,则需要在Maven中注入maven-jar的插件

    <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.4</version><configuration><archive><manifest><addClasspath>true</addClasspath></manifest><manifestEntries><Premain-Class>                                                               xyz.leyuna.laboratory.core.agent.AgentScene</Premain-Class><Can-Redefine-Classes>true</Can-Redefine-Classes><Can-Retransform-Classes>true</Can-Retransform-Classes><Manifest-Version>true</Manifest-Version></manifestEntries></archive></configuration></plugin></plugins></build>

除此之外还有更多的参数,以及参数的意义,有需要扩展的可以直接看JDK的英文文档:

https://docs.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html?is-external=true

插件使用:

再Vm参数设置一行


通过 -javaagent:路径/agent的jar包名=你需要设置的入参agentOps

代码实现

premain

premain方法是在main方法执行前会进行的方法,常用与日志、某些功能的起步加载等等。

首先要明确,premain方法一定得是premain名,不可改变,他是JDK设置agent机制时的一个规范,所以我们在代码中由两种实现premain方法的模板:

1、

    public static void premain(String agentOps, Instrumentation inst){System.out.println("方法一");System.out.println(agentOps);}

2、

    public static void premain(String agentOps){System.out.println("方法二");System.out.println(agentOps);}

两个方法的执行优先度是:1>2,当1存在且正常执行后,不会再执行2.

首先说下参数agentOps,是再VM设置加载插件时,进入的入参。

Instrumentation,agent机制的核心类,使用该类,可以对类字节、原class等直接进行操作。

那么这个方法的一个运行测试图下:

agentmain

agentmain是在agent插件中涉及的最多的方法,他是一个可在main方法运行后,再次进行的方法。那么JVM的性能监控、热部署等等功能,都是基于在main方法运行后,可再次进行的特性完成,并且因为Instrumentation提供可直接操作类字节码的特性,我们可以做到对指定class文件的实时替换或修改。

agentmain的实现:

    public static void agentmain(String agentOps, Instrumentation inst) {System.out.println("main方法之后执行");String className = "指定替换的类名";Class[] allLoadedClasses = inst.getAllLoadedClasses();Class tempClazz = null;for (Class clazz : allLoadedClasses) {if (className.equals(clazz.getCanonicalName())) {//需要替换类的类字节码文件tempClazz = clazz;}}ClassDefinition classDefinition = new    ClassDefinition(tempClazz,"替换的类字节码的二进制数".getBytes());//替换inst.redefineClasses(classDefinition);}

除了定义agentmain方法外,还需要在main方法中自己开启agentmain方法的注入。

    public static void main(String[] args)  {//如果本虚拟机线程id为1,则监听他VirtualMachine attach = VirtualMachine.attach("1");//注入agentmain的探针系统attach.loadAgent("探针jar包的路径", "ops参数");}

这里有一点要注意VirtualMachine不是JDK自动注入的类,他在com.sun.tools包下。

所以如果你的项目中目前没有这个jar包的依赖则需要在JDK的目录下lib/tools.jar,自己手动导入此jar包。

总结

以上就是自己手动定义出一个agent探针程序的实现了,接下来的一篇,会具体分析:

  1. 如何做到的
  2. 能做到什么
  3. 怎么做

JAVA探针机制—Agent(一)相关推荐

  1. java 字节码增强原理_深入浅出Java探针技术1--基于java agent的字节码增强案例

    Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...

  2. java探针 字节码增强_深入浅出Java探针技术1--基于java agent的字节码增强案例

    Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...

  3. 【JAVA基础☞探针技术】Java探针-Java Agent技术

    个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 1.原理:基于javaAgent和Java字节码注入技术的java探针工具技术原理 2.原理分析 动态代理功能实现说明,我们利用ja ...

  4. java探针之修改类字节码文件

    java探针利用了javaAgent + ASM字节码注入工具实现了动态修改类文件的功能.像skywalking和arthas都使用到了这个技术. 具体原理为: jdk1.5以后引入了javaAgen ...

  5. Skywalking使用与探针机制

    对于 大型 几十个.几百个微服务构成的微服务架构系统 出现问题无法快速定位.各个微服务之间的依赖关系理不清.各个微服务的接口性能很难分析.业务调用流程处理顺序理不清 skywalking是一个国产开源 ...

  6. Java探针--javaagent--使用/实例

    原文网址:Java探针--javaagent--使用/实例_IT利刃出鞘的博客-CSDN博客 简介 本文用示例介绍javaagent的用法. javaagent简介 JavaAgent 是JDK 1. ...

  7. 阿里面试题,说说Java 类加载机制

    点击上方"Java后端技术栈"关注 持续推送技术干货 面试时,阿里面试官问了两个问题: 1.可以不可以自己写个String类? 答:不可以,因为根据类加载的双亲委派机制,会去加载父 ...

  8. Java探针之JavaAgent揭秘

    java探针利用了javaAgent + ASM字节码注入工具实现了动态修改类文件的功能.这是很多arthas和APM应用监控系统如Skywalking的基础. 首先什么是JavaAgent呢? 什么 ...

  9. 总结:Java探针技术

    一.介绍 探针技术通过JVM启动参数的 标准参数的-javaagent实现,原理是 在JVM加载class二进制文件的时候,动态的修改加载的class文件,在监控的方法前后添加计时器功能,用于计算监控 ...

最新文章

  1. 以太坊智能合约Demo
  2. 【怎样写代码】参数化类型 -- 泛型(二):泛型的优点
  3. Leangoo产品白皮书
  4. Sonar问题解决:普通方法调用静态属性
  5. JPOM - AOP+自定义注解实现操作日志记录
  6. matlab 腐蚀 结构元素,图像的腐蚀
  7. JavaScript - reduce用法详解
  8. CodeForces 615C
  9. json里面的list数据取不出来_[工具]用kaggle API下载数据集
  10. GOF23种设计模式
  11. 每周个人进度总结06
  12. 如何将PDF设置为只读?
  13. 线性时间选择算法(Java)
  14. 笔记本显卡天梯图 2022
  15. 利用Python+xarray+cartopy+matplotlib 实现遥感地形图制图绘制 —— xarray 学习文档01
  16. error C2144: syntax error: 'int' should be preceded by ';'
  17. 童瑶担任奥伦纳素“冰白大使”,高端护肤品类加速扩张中国市场
  18. WinInet库之FTP通信
  19. 中鑫吉鼎|家庭成长期如何进行理财规划
  20. MySQL数据库(一)——基本介绍

热门文章

  1. SQLyog 自动完成
  2. 关于《火影忍者 博人传》的一点想法
  3. leetcode 526优美的数列
  4. 《系统化思维导论》杂谈
  5. 补天SRC漏洞数排名
  6. 【20210825】【数据分析】两个向量做相关性分析时,需不需要统一量纲?
  7. web前端期末大作业 HTML+CSS+JS 游戏介绍【学生网页设计作业源码】
  8. C#学习之操作excel表格
  9. Word~Word修改行间距磅值
  10. 【PTA】【C语言】复盘练习——编程题