调式、热部署背后的Java Agent探针技术
《调式、热部署背后的Java Agent探针技术》共 0.2 万字,通篇围绕 Agent、部署、场景 展开,归在「Agent 与工具调用」这一层。
适合要让 AI 真的去干活、不只是陪人聊天的人
目录骨架(5 节)
- 一、什么是java Agent
- 二、java Agent简单实现
- 前提概要
- Java Agent 功能介绍
- 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方法前加了一层拦截器。在类加载之前,完成对字节码修改

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。
