通过JNI调用Java的C DLL如何监控内存使用情况?

6

如何监控通过JNI从Java调用的本地C DLL使用的内存?使用标准的Java监控工具和选项,可以看到Java内存空间,但无法查看任何由C DLL使用的内存。Java使用了约70MB,但任务管理器中显示200Mb+,如果可能的话,我想看看这额外的130MB中有什么。

4个回答

3
你可以使用性能监视器(perfmon32)的计数器来监控本机堆,但它不会按DLL进行分解,即使jvm.dll也将包括在内。
大多数性能分析工具都可以附加到进程并捕获和跟踪内存分配和释放。这使它们可以推测泄漏的位置。 最近我在尝试跟踪从Java调用的本机代码中的内存泄漏时发现了一个相当不错的工具,叫做Memory Validator

谢谢你的提示,Declan。我会在周一尝试这个方法。 - lawsonj2019
1
在Java中调用的JNI DLL中监控内存使用情况 http://www.softwareverify.com/software-verify-blog/?p=221 - Stephen Kellett

1

你尝试过使用进程查看器深入挖掘吗?

如果你有DLL的源代码,你可以使用调试库和内存分配跟踪器重新构建,并使用Visual C++调试器进行调试(你需要告诉它使用Java应用程序)。

如果你没有源代码,那么选项就有限了。


这提供了一些更多的信息,Richard,但还不足以确定泄漏的位置。进程查看器是任何基于Windows的开发人员工具包中必备的优秀工具! - lawsonj2019
如果你有源代码,那么你可以从 VS 重新构建和调试... (详见答案) - Richard Harrison

-1

我相信即使在C DLL内部进行这样的操作也不会很容易。

据我所知,标准Java监视工具通过查询虚拟机来收集信息,因此即使该内存位于同一进程中,除非虚拟机知道如何检查您的动态链接库,否则它将无法看到任何内容。我认为您需要使用外部工具或对DLL进行相当大的修改才能跟踪其内存使用情况。


Java 监控工具仅提供 Java 堆的信息,并不报告 Windows 为本机调用附加的任何内存。 - lawsonj2019

-1

既然DLL并不是Java堆的一部分,我认为最准确的方法是编写一个小型的分析程序(可以是Java/JNI程序或C++/C#等),以类似于应用程序的方式导入和使用DLL,并且仅仅使用DLL - 分析应用程序的内存配置文件将是DLL内存配置文件的良好近似值。

您还应该测试DLL是否具有静态或动态内存形状 - 在加载DLL之前和之后直接进行内存测量,以查看是否存在一次性的130MB左右的内存占用,或者内存是否随时间缓慢增加。

在Solaris / Linux上,我听说Sun Studio Collector / Analyzer是一个很好的工具,但您被困在DLL领域(或者说DLL地狱)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接