【问题标题】:How to detect memory Leak in Java application outside the heap?如何检测堆外Java应用程序中的内存泄漏?
【发布时间】:2015-07-28 08:17:50
【问题描述】:

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

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

我们怀疑 SWT 和/或 JNA/DLL 存在一些内存泄漏,但无法确定原因或位置。

Windows 平台上是否有任何工具可以帮助检测此类问题?或者 Java 平台中的任何工具可以帮助解决这个问题?欢迎提出任何建议。

【问题讨论】:

  • SWT 最常见的泄漏是应用程序无法dispose 之类的东西 Color

标签: java memory memory-leaks swt jna


【解决方案1】:

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

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

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


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

【讨论】:

  • “由于 NMT 不跟踪非 JVM 代码的内存分配,您可能必须使用操作系统支持的工具来检测本机代码中的内存泄漏。”在我看来,这听起来无助于跟踪 JVM 堆之外的内存泄漏。如果我错了,您能否详细说明一下,因为我很想了解有关此主题的更多信息。
  • @Joeblade 本机内存由 JVM 代码分配用于其他目的,它不仅仅是您可以使用它检查的堆。但是,是的,它有其局限性,在这种情况下它可能不起作用。它仍然是一个值得了解的功能。
  • @bizclop :) 是的,这就是我希望诱使您详细说明的原因。我以前没听说过,所以很好奇。
  • 是的,值得了解 NMT 可以做什么。那你们能推荐一个windows的原生解决方案吗?
猜你喜欢
  • 2020-02-14
  • 1970-01-01
  • 2018-01-17
  • 2011-10-09
  • 2013-04-26
  • 1970-01-01
  • 2015-11-17
  • 2013-04-16
  • 1970-01-01
相关资源
最近更新 更多