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



我们有一个在Windows 7环境下通过JNA使用SWT和其他一些DLL的Java应用程序。

我们已经看到JVM进程的内存使用随着时间的推移而增加,但是JVM堆在正常的GC活动下相对稳定。

我们怀疑有一些内存泄漏从SWT和/或JNA/DLL,但不能确定为什么或在哪里。

Windows平台上有什么工具可以帮助检测这类问题吗?或者Java平台中的任何工具可以帮助解决这个问题?

在Java 8中有一个命令行开关:-XX:NativeMemoryTracking=<value>,其中值可以是off, summarydetail

您可以将其设置为detail,然后您可以使用jcmd查询。

这里有一些官方文档。虽然这个功能是相当有限的,但它可能只是帮助找到原因。


如果做不到这一点,那么识别问题根源的一种粗糙但有效的方法是将dll替换为虚拟版本(甚至是非本地虚拟版本),并查看是否可以重现相同的问题。

最新更新