首先,JTI是啥?
HotSpot JVM是使用C++写的,在操作系统层面来看,java.exe进程与其他进程并无特别之处。任何一个进程都可以加载第三方的DLL,JTI就是java.exe开放出来的向Java.exe进程注入dll的接口。也就是说,开发者根据JTI定义好的规范,用C++写一个dll,这个dll就可以被java.exe进程加载了【启动jvm的时候要加上-agentlib参数】。
JTI的详细资料参见以下网址:http://docs.oracle.com/javase/7/docs/platform/jvmti/jvmti.html。
JNI不用多说了。
这里有意思的是,如果前面写的JTI dll通过JNI,为java程序提供了直接的调用接口,那就打通了从Java语言到JTI功能的整个调用通道,如下:
首先,Java通过JNI,调用JTI dll中的方法。
然后,我们自己写的JTI dll,通过JTI接口访问JVM的内部结构,并获取JVM内部信息,并返回。
最后,Java程序获得JVM内部信息。
那么JTI可以提供什么内部信息呢?简单的说,Java调试程序能获取的任何信息,JTI都能获得,这是因为Java调试器都是基于JTI写的。
举两个例子,以下是JTI开放出来的两个调用函数:
GetObjectSize:获取指定对象占据内存的大小。
FollowReferences:获取从指定对象能够访问的所有对象。
也就是说,通过以上调用过程,应用层的Java代码就可以获取以上功能了,这在普通的JDK上是没有的。
最后,实现了这一点不知道有没有用处,但一定很有意思。。。
时间: 2024-10-23 23:23:06