我们有一个在Windows 7环境下通过JNA使用SWT和其他一些DLL的Java应用程序。
我们已经看到JVM进程的内存使用随着时间的推移而增加,但是JVM堆在正常的GC活动下相对稳定。
我们怀疑有一些内存泄漏从SWT和/或JNA/DLL,但不能确定为什么或在哪里。
Windows平台上有什么工具可以帮助检测这类问题吗?或者Java平台中的任何工具可以帮助解决这个问题?
在Java 8中有一个命令行开关:-XX:NativeMemoryTracking=<value>
,其中值可以是off
, summary
或detail
。
您可以将其设置为detail
,然后您可以使用jcmd
查询。
这里有一些官方文档。虽然这个功能是相当有限的,但它可能只是帮助找到原因。
如果做不到这一点,那么识别问题根源的一种粗糙但有效的方法是将dll替换为虚拟版本(甚至是非本地虚拟版本),并查看是否可以重现相同的问题。