Agent 与工具调用2148 字

调式、热部署背后的Java Agent探针技术

·全库 541 / 611

《调式、热部署背后的Java Agent探针技术》共 0.2 万字,通篇围绕 Agent、部署、场景 展开,归在「Agent 与工具调用」这一层。

覆盖Agent部署场景

适合要让 AI 真的去干活、不只是陪人聊天的人

目录骨架(5 节)
  1. 一、什么是java Agent
  2. 二、java Agent简单实现
  3. 前提概要
  4. Java Agent 功能介绍
  5. Java Agent 实现原理

前提概要

  • Java调式、热部署、JVM背后的支持者Java Agent:
  • 各个 Java IDE 的调试功能,例如 eclipse、IntelliJ ;
  • 热部署功能,例如 JRebel、XRebel、spring-loaded;
  • 各种线上诊断工具,例如 Btrace、Greys,还有阿里的 Arthas;
  • 各种性能分析工具,例如 Visual VM、JConsole 等;

​

​

一、什么是java Agent

Java Agent 直译为 Java 代理,中文圈也流行另外一个称呼 Java 探针 Probe 技术。

​

它在 JDK1.5 引入,是一种可以动态修改 Java 字节码的技术。Java 类编译后形成字节码被 JVM 执行,在 JVM 在执行这些字节码之前获取这些字节码的信息,并且通过字节码转换器ClassFileTransformer 对这些字节码进行修改,以此来完成一些额外的功能。Java Agent 是一个不能独立运行 jar 包,它通过依附于目标程序的 JVM 进程,进行工作

​

//Java Agent 和目标进程一起启动模式

​

nohup java -jar -Dspring.profiles.active=prod -DworkId=1 -javaagent:/opentelemetry-javaagent.jar -Dfile.encoding=utf-8 -Xms4028M -Xmx4028M -XX:PermSize=512M -XX:MaxPermSize=512M /launch-adapter-0.0.1-SNAPSHOT.jar >/dev/null 2>&1 &

​

​

Agent 启动拦截提供两种方式:

启动时修改

程序运行前:在Main方法执行之前,通过一个叫 premain方法来执行

启动时修改主要是在jvm启动时,执行native函数的Agent_OnLoad方法,在方法执行时,执行如下步骤:

• 创建InstrumentationImpl对象

• 监听ClassFileLoadHook事件

• 调用InstrumentationImpl的loadClassAndCallPremain方法,在这个方法里会去调用javaagent里MANIFEST.MF里指定的Premain-Class类的premain方法

​

运行时修改

​

运行时修改主要是通过jvm的attach机制来请求目标jvm加载对应的agent,执行native函数的Agent_OnAttach方法,在方法执行时,执行如下步骤:

• 创建InstrumentationImpl对象

• 监听ClassFileLoadHook事件

• 调用InstrumentationImpl的loadClassAndCallAgentmain方法,在这个方法里会去调用javaagent里MANIFEST.MF里指定的Agentmain-Class类的agentmain方法

​

启动时需要在目标程序的启动参数中添加 -javaagent参数,Java Agent 内部通过注册 ClassFileTransformer ,这个转化器在Java 程序 Main方法前加了一层拦截器。在类加载之前,完成对字节码修改

image.png

Java Agent 具备以下的能力

• Java Agent 能够在加载 Java 字节码之前拦截并对字节码进行修改;

​

• Java Agent 能够在 Jvm 运行期间修改已经加载的字节码;

​

Java Agent 的价值

• IDE 的调试功能,例如 Eclipse、IntelliJ IDEA

• 热部署功能,例如 JRebel、XRebel、spring-loaded

• 各种线上诊断工具,例如 Btrace、Greys,国内阿里的 Arthas

• 各种性能分析工具,例如 Visual VM、JConsole 等

• 全链路性能检测工具,例如 OpenTelemetry、Skywalking、Pinpoint等 。

Java Agent 功能介绍

Java Agent 主要有以下功能

​

Java Agent 能够在加载 Java 字节码之前拦截并对字节码进行修改;

Java Agent 能够在 Jvm 运行期间修改已经加载的字节码;

Java Agent 的应用场景

​

IDE 的调试功能,例如 Eclipse、IntelliJ IDEA ;

热部署功能,例如 JRebel、XRebel、spring-loaded;

各种线上诊断工具,例如 Btrace、Greys,还有阿里的 Arthas;

各种性能分析工具,例如 Visual VM、JConsole 等;

全链路性能检测工具,例如 Skywalking、Pinpoint等;

Java Agent 实现原理

在了解Java Agent的实现原理之前,需要对Java类加载机制有一个较为清晰的认知。一种是在man方法执行之前,通过premain来执行,另一种是程序运行中修改,需通过JVM中的Attach实现,Attach的实现原理是基于JVMTI。

资料里没有你的场景?

把你手上的数据和想解决的那个环节发上来,我们按具体情况回,不复述方法论。

发布需求