JVM TI 示例代码
Java 虚拟机工具接口 (JVM TI)是一个本地语言工具开发接口,在JDK1.5以上的版本中提供。 使用JVMTI接口编写的本地库可以加载进入JVM中(使用-agentlib, -agentpath, or -Xrun 命令行参数),这些库被称作“代理”。
JVM TI在运行中使用JNI,JVMTI 最终会取代另外两个接口:JVMDI和JVMPI。
我们写了一些示例的代理,帮助展示这套接口的特性和功能。这些代理可能会更改。他们仅用来告诉工具编写者如何开发工具。
这些代理随每个JDK版本发布, 并进行了一些简单测试,但是没有很详尽的测试。每个JDK都包含有这些库的二进制版本和原代码,放在JDK的demo/jvmti 目录中。
运行这些代理
运行代理意味着虚拟机在运行任何java代码前加载代理库。jdk在${JAVA_HOME}/demo/jvmti/agent-name /lib目录中,在solaris操作系统上,可能是sparcv9或者amd64子目录。如果java报告找不到这些库,把他们加入到LD_LIBRARY_PATH 换季变量中(UNIX),或者PATH换季功能变量(Windows),这是系统相关的。如果你在64位solaris上使用,使用LD_LIBRARY_PATH64。一些代理库比如hprof和jdwp放在jdk主目录中,可以被很容易加载。
使用BCI的代理库,比如hprof, heapTracker, mtrace, and minst,还需要使他们所需要的库加入bootclasspath。hprof是哟功能的类已经加入了,别的类需要调用AddToBootstrapClassLoaderSearch添加。虽然我们觉得这不是理想的处理方法,不过因为是演示,还可以接受。想象状况下,代理应该获取他自己所在目录,然后从那个目录中加载jar文件。现在的代理没有这么做。
如果你要修改这些代理,仔细看上面说的,以确保你的工作。我们推荐你改变代理的名字避免和已有的混淆。
可用的示例
- versionCheck
一个非常简单的例子,功能是检查JVMTI 的版本,包括定义在jvmti.h文件中的和运行的JVM所支持的。 - mtrace
一个小例子,功能是追踪类的方法调用。这个例子使用了BCI,通过调用java_crw_demo库来实现。 - minst
This is an even smaller agent that does just method entry tracing. It also uses Bytecode Instrumentation (BCI) via the java_crw_demo library, but the instrumentation code is pure Java (no Java native methods used). NOTE: Be sure to check out java.lang.instrument for a way to avoid native code agents completely. - gctest
This is a small agent that does garbage collection counting. - heapViewer
This is a small agent that does some basic heap inspections. - heapTracker
This is a small agent that does BCI to capture object creation and track them. It uses Bytecode Instrumentation (BCI) via the java_crw_demo library. - waiters
This is a small agent that gets information about threads waiting on monitors. - hprof
This is a large agent that does heap and cpu profiling. This demo agent is actually built into the Java Runtime Environment (JRE). It uses Bytecode Instrumentation (BCI) via the java_crw_demo library.
Note: hprof is NOT a small or simple agent, the other smaller demos should be looked at first.