如何使用 visualvm 查找内存泄漏

Posted

技术标签:

【中文标题】如何使用 visualvm 查找内存泄漏【英文标题】:How to find memory leaks using visualvm 【发布时间】:2012-02-27 14:43:31 【问题描述】:

我怀疑我们的 ActiveMQ 连接桥中存在严重的内存泄漏 - 我们看到了典型的内存泄漏模式(应用加载正常,如果长时间运行或在短时间内反复重新启动会变慢时间)。我查找了查找 Java 内存泄漏的现代最佳实践,许多开发人员似乎正在放弃 jhat/jmap 等传统工具,而不是新的jvisualvm

启动此工具后(并花几个小时阅读其教程),我能够为 CPU 和内存拍摄分析器快照。

我只是在这一点上卡住了 - 我如何分析这些快照以识别泄漏?关于如何使用 jvisualvm 生成快照的文档很多,但关于如何真正理解它们的文档却很少。

提前致谢。

【问题讨论】:

您是否尝试过在源代码上运行FindBugs?我发现这在识别可能导致内存泄漏的代码方面非常有效。 感谢您的建议 - 但有两件事:(1)我被反复告知 FindBugs 对 NullPointerExceptions 有好处,但对内存泄漏没有好处,更重要的是,(2)我真的想熟悉 jvisualvm,所以除非它明显不适合这项工作,我有兴趣看看它是如何用作诊断工具的。再次感谢您的好建议! 一件小事:Tools/Plugins/Available Plugins -- 安装 Visual GC -- 该插件可以更好地显示您的堆内存和 GC 状态。 【参考方案1】:

使用 visualvm 分析内存泄漏并不容易。它有一个名为“sampler”的工具/插件。这可用于对内存或 cpu 进行采样。您可以定期拍摄快照并查找可能的泄漏。这里有一些关于如何使用它的细节- 来自quick search

更有效的方法是获取堆转储(例如当应用程序变慢或OOM happens 时)。 VisualVM 帮助您进行 heapdump(使用 Monitor 选项卡上的 Heap Dump

这个文件可以被MAT分析-一些细节在这里How do I analyze a .hprof file?

【讨论】:

MAT 也可以在没有 VisualVM 的情况下自行进行堆转储 可能链接到这里的文章现在可以在dzone.com/articles/…获得

以上是关于如何使用 visualvm 查找内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

使用VisualVM分析性能

如何使用 valgrind 查找内存泄漏?

Java 性能调优、JNI 内存泄漏

如何查找 Java 内存泄漏

Go(lang):如何使用 PPROF 堆配置文件来查找内存泄漏?

如何在eclipse中使用MAT查找内存泄漏