JTI + JNI,为Java程序提供获取JVM内部信息的通道
2015-03-28 22:15
423 查看
首先,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上是没有的。
最后,实现了这一点不知道有没有用处,但一定很有意思。。。
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上是没有的。
最后,实现了这一点不知道有没有用处,但一定很有意思。。。
相关文章推荐
- java 程序获取在exe 在控制台输出的信息
- Java如何获取系统信息(包括操作系统、jvm、cpu、内存、硬盘、网络、io等)
- java 利用ManagementFactory获取jvm,os的一些信息
- Cocos2dx 项目 C++ 通过Jni 调用Java获取字符串信息错乱
- 夯实JAVA基本之二 —— 反射(3):类内部信息获取
- java获取JVM信息
- 【Java】【系统状态】获取系统信息(包括操作系统、jvm、cpu、内存、硬盘、网络、io等)
- JSP利用JNI获取硬盘信息(型号,序列号,容量...) ,提供固定下载地址
- 【Java】【系统状态】获取系统信息(包括操作系统、jvm、cpu、内存、硬盘、网络、io等)
- c++代码通过JNI调用Java代码时用到的签名信息如何获取
- java JNI调用动态库 获取硬件信息 制作软件加密
- 【Java】【系统状态】获取系统信息(包括操作系统、jvm、cpu、内存、硬盘、网络、io等)
- 获取java程序运行时内存信息
- 夯实JAVA基本之二 —— 反射(3):类内部信息获取
- System类和JAVA程序启动是JVM中的详细信息
- 其他信息: 具有固定名称“Npgsql”的 ADO.NET 提供程序未在计算机或应用程序配置文件中注册或无法加载。有关详细信息,请参阅内部异常
- 【Java】【系统状态】获取系统信息(包括操作系统、jvm、cpu、内存、硬盘、网络、io等)
- Java 程序获取系统硬件信息之网卡MAC地址
- Java程序使用httpClient发送Url链接,并获取返回的数据信息
- Java 反射(3):类内部信息获取