JTI + JNI,为Java程序提供获取JVM内部信息的通道

首先,JTI是啥?

HotSpot JVM是使用C++写的,在操作系统层面来看,java.exe进程与其他进程并无特别之处。任何一个进程都可以加载第三方的DLL,JTI就是java.exe开放出来的向Java.exe进程注入dll的接口。也就是说,开发者根据JTI定义好的规范,用C++写一个dll,这个dll就可以被java.exe进程加载了【启动jvm的时候要加上-agentlib参数】。

JTI的详细资料参见以下网址:。

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上是没有的。

最后,实现了这一点不知道有没有用处,但一定很有意思。。。

离开你的那一天开始,左心房渐渐停止跳动…

JTI + JNI,为Java程序提供获取JVM内部信息的通道

相关文章:

你感兴趣的文章:

标签云: