JVM TI介绍
JVM TI 全名是 JVMTM Tool Interface,是开发虚拟机监控工具使用的编程接口,它可以监控 JVM 内部事件的执行,也可以控制 JVM 的某些行为,可以实现调试、监控、线程分析、覆盖率分析工具等。 JVMTI并不一定在所有的虚拟机上都有实现,不同的虚拟机实现也不相同。不过在一些主流的虚拟机中,提供了标准的实现。 JVMTI是一套本地的代码接口,需要使用jni来使用他。
Agent
Agent 即 JVMTI 的客户端,它和执行 Java 程序的虚拟机运行在同一个进程上,因此通常他们的实现都很紧凑,他们通常由另一个独立的进程控制,充当这个独立进程和当前虚拟机之间的中介,通过调用 JVMTI 提供的接口和虚拟机交互,负责获取并返回当前虚拟机的状态或者转发控制命令。
agent的工作过程
Agent是在java虚拟机启动之时加载的,这个还在处于虚拟机初始化的早期:
所有的java类未被初始化
所有的对象实例都未被创建
没有java代码被执行
操作JVMTI的Capability参数: 使用系统参数:
动态库被加载之后,虚拟机会寻找一个agent入口函数
JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved)
这个函数中传入了一个javaVM指针,以及命令行的参数。通过JavaVm可以获取到JVMTI的指针,并获得使用JVMTI函数的能力。
JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved)
agent还可以在动态时加载。虚拟机会在运行时候箭头agent的加载,会使用如下函数。
JNIEXPORT jint JNICALL Agent_OnAttach(JavaVM* vm, char *options, void *reserved);
退出agent或者虚拟机关闭的时候,虚拟机会调用一个类似于析构函数的方法来完成最后的清理任务。
JNIEXPORT void JNICALL Agent_OnUnload(JavaVM *vm)