如何获取Java堆的内存地址?

And*_*nke 7 java matlab

如何确定当前进程中运行的JVM的Java堆内存地址?也就是说,使用Java,C或其他调用获取一个void*指针或等效于JVM为堆分配的内存的连续区域?

Matlab在其进程中嵌入了JVM.JVM分配的内存对于Matlab数组是不可用的,而且这一点很重要,因为它占用了大量连续的内存并且从不收缩,而Matlab也需要连续的内存用于其数组.如果在扩展期间重新分配堆,则可能导致碎片.

我想检查我的进程来检查Java堆和Matlab的内存视图之间的交互,并找出它由于调整大小而移动的时间,最好是在进程内.这需要堆的地址.从java.lang.Runtime很容易找到堆大小,但在内存中找不到它的地址.如何才能做到这一点?

我在Windows XP和Server 2003上的Matlab R2008b进程中运行Sun的JRE 1.6.0_04.我意识到这可能需要特定于供应商的技术.该过程运行我们编写的代码,因此我们可以使用自定义Java,Matlab,JNI和C/C++代码.JVM中的Java方法调用或支持的钩子优先于低级别的hackery.

编辑:这个目的是检查JVM的GC和Matlab的GC之间的相互作用.我没有必要查看Java堆,也不会从该内存中读取任何内容; 我只想看看它在整个虚拟内存空间的上下文中,Matlab的GC也试图将数据放入其中.

QAZ*_*QAZ 2

获取 JVM 实际堆地址的一种快速而肮脏的方法是跳转到 WinDbg,附加到 JVM 并发出单个 !address 命令。0x2 附近的某个地方???????(它在 jvm 版本之间有所不同,但对该版本保持静态)将是一个标记为 PAGE_EXECUTE_READWRITE 的大型 VAD,这是进程内存中的 JVM 堆。

为了进行确认,您可以在 kernel32!VirtualAlloc 上设置断点,并且在 JVM.DLL 模块中的 JVM 初始化时,您将调用 VirtualAlloc,显示 jvm 分配其堆。如果您查看此调用周围的代码,您可以看到地址是如何计算的。