如何检测Java应用程序中堆外的内存泄漏?

4
我们有一个使用SWT和一些其他DLL通过JNA在Windows 7环境下运行的Java应用程序。
我们发现随着时间的推移,JVM进程的内存使用量增加,但JVM堆相对稳定,正常进行GC活动。
我们怀疑SWT和/或JNA / DLL存在一些内存泄漏,但无法确定为什么或在哪里。
在Windows平台上有没有工具可以帮助检测这种问题?还是在Java平台上有任何能够解决此问题的设施?欢迎任何建议。

SWT中最常见的泄漏是应用程序未能“处理”诸如“Color”之类的事物。 - greg-449
1个回答

2
在Java 8中有一个命令行开关:-XX:NativeMemoryTracking=<value>,其中value可以是offsummarydetail
您可以将其设置为detail,然后使用jcmd查询它。
这里有一些官方文档(链接)。虽然此功能相当有限,但它可能会帮助找到问题的原因。
如果无法解决问题,识别问题来源的一个粗略但有效的方法是将dll替换为虚拟版本(甚至是非本地虚拟版本),看看是否能够重现相同的问题。

1
由于NMT不跟踪非JVM代码的内存分配,因此您可能需要使用操作系统支持的工具来检测本地代码中的内存泄漏。在我看来,这似乎无法帮助跟踪JVM堆之外的内存泄漏。如果我错了,请详细说明,因为我很想在这个主题上学到更多。 - Joeblade
1
@Joeblade 本地内存也是由JVM代码为其他目的分配的,不仅仅是堆可以使用它进行检查。但是,是的,它有其限制,并且在这种情况下可能无法正常工作。但它仍然是一个值得了解的功能。 - biziclop
@bizclop :) 是的,这就是为什么我希望能够诱导你详细说明一下。我之前没有听说过它,所以很好奇。 - Joeblade
是的,了解NMT能做什么很值得。你们能推荐一个Windows本地解决方案吗? - Wudong

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