Java Agent 是一种运行在目标 JVM 内、用于对字节码做增强的程序。它基于 JVMTI(JVM Tool Interface)与
java.lang.instrument包,既能在 JVM 启动时挂载(premain),也能在 JVM 运行期动态挂载(agentmain),是 APM 监控、链路追踪、热修复、线上诊断工具的通用底座。
1. 背景:JVMTI 与 Instrumentation
JVMTI 是 JVM 对外暴露的一套 Native 接口,外部程序通过它获取线程、GC、类加载等信息,并注册事件回调。Java SE 5 之前编写 Agent 只能靠 Native 代码;从 Java SE 5 起,可以使用纯 Java 的 java.lang.instrument 包来编写,其底层仍由 JVMTI 完成。Agent 的价值在于:不修改业务源码的前提下,改写或增强目标类的字节码。