一、JavaAgent
启动时加载的 JavaAgent 是 JDK1.5 之后引入的新特性,提供了在 JVM 将字节码文件读入内存之后,JVM 使用对应的字节流在 Java 堆中生成一个 Class 对象之前,可以对其字节码进行修改的能力,从而 JVM 也将会使用用户修改过之后的字节码进行 Class 对象的创建。
- 可以在加载 class 文件之前做拦截,对字节码做修改
- 可以在运行期对已加载类的字节码做变更,但是这种情况下会有很多的限制,后面会详细说
- 还有其他一些小众的功能
-
- 获取所有已经加载过的类
- 获取所有已经初始化过的类(执行过 clinit 方法,是上面的一个子集)
- 获取某个对象的大小
- 将某个 jar 加入到 bootstrap classpath 里作为高优先级被 bootstrapClassloader 加载
- 将某个 jar 加入到 classpath 里供 AppClassloard 去加载
- 设置某些 native 方法的前缀,主要在查找 native 方法的时候做规则匹配
JVM Tool Interface
JVMTI 是 JVM 暴露出来的一些供用户进行自定义扩展的接口集合,每当 jvm 执行到一些特定的逻辑的时间,就会去进行触发这些回调接口,用户就恰好可以在此回调接口之中做一些自定义逻辑。</