如何确定当前进程中运行的JVM的Java堆内存地址?也就是说,使用Java、C或其他调用获取一个void*指针或等效指针,指向JVM为堆分配的连续内存区域?
Matlab在其进程中嵌入了JVM。JVM分配的内存对于Matlab数组不可用,其中堆很重要,因为它占用了一个大的连续内存块并且永远不会缩小,而Matlab也需要连续内存块来存储其数组。如果在扩展期间重新分配堆,则可能导致碎片化。
我想对我的进程进行检测,以研究Java堆和Matlab内存视图之间的交互,并找出当其由于调整大小而移动时,并最好全部在进程内完成。这需要知道堆的地址。从java.lang.Runtime可以很容易地找到堆的大小,但无法找到其在内存中的地址。如何实现呢?
我在Windows XP和Server 2003上运行Sun的JRE 1.6.0_04,运行我们编写的代码,所以我们可以使用自定义Java、Matlab、JNI和C/C++代码。最好使用Java方法调用或JVM中支持的钩子,而不是低级别的hackery。
编辑:此目的是为了检查JVM的GC和Matlab的GC之间的交互。我不需要看到Java堆内部,也不会从该内存读取任何内容;我只想知道它在整个虚拟内存空间的上下文中的位置,Matlab的GC也试图将数据放入其中。
Matlab在其进程中嵌入了JVM。JVM分配的内存对于Matlab数组不可用,其中堆很重要,因为它占用了一个大的连续内存块并且永远不会缩小,而Matlab也需要连续内存块来存储其数组。如果在扩展期间重新分配堆,则可能导致碎片化。
我想对我的进程进行检测,以研究Java堆和Matlab内存视图之间的交互,并找出当其由于调整大小而移动时,并最好全部在进程内完成。这需要知道堆的地址。从java.lang.Runtime可以很容易地找到堆的大小,但无法找到其在内存中的地址。如何实现呢?
我在Windows XP和Server 2003上运行Sun的JRE 1.6.0_04,运行我们编写的代码,所以我们可以使用自定义Java、Matlab、JNI和C/C++代码。最好使用Java方法调用或JVM中支持的钩子,而不是低级别的hackery。
编辑:此目的是为了检查JVM的GC和Matlab的GC之间的交互。我不需要看到Java堆内部,也不会从该内存读取任何内容;我只想知道它在整个虚拟内存空间的上下文中的位置,Matlab的GC也试图将数据放入其中。