OutOfMemory 异常 - VisualVM 如何通过 heapdump 文件帮助定位内存泄漏?

Posted

技术标签:

【中文标题】OutOfMemory 异常 - VisualVM 如何通过 heapdump 文件帮助定位内存泄漏?【英文标题】:OutOfMemory Exception - how does VisualVM help locate the memory leak with heapdump file? 【发布时间】:2011-06-22 21:59:25 【问题描述】:

我一直在我的电脑上本地测试我的 web 应用程序并使用 VisualVM 对其进行监控。我最近也开始使用 JMeter,因为有人建议我应该做一些负载测试,因为我怀疑我的某个地方存在缓慢的内存泄漏。

今天我的 webapp 终于抛出了OutOfMemory 异常。我设置了HeapDumpOnOutOfMemoryErrorHeapDumpPath 参数以防万一发生这种情况。生成了一个堆转储文件。

我在 VisualVM 中打开了这个文件 (java_pid2760.hprof),老实说,我不明白我应该如何查明这个内存泄漏的罪魁祸首......

如何使用 VisualVM 分析堆转储并找到导致内存泄漏的类/实例?

【问题讨论】:

How do I analyze a .hprof file? 的可能重复项 还有相关的:***.com/questions/2064456/…,***.com/questions/1795778/…,***.com/questions/2422868/how-to-analyze-heap-dumps 我的问题旨在使用 VisualVM 查明内存泄漏。这个JDK自带的产品应该可以吧?我很欣赏使用其他类型软件的建议,但由于我有 VisualVM,我想坚持使用它。有没有人用 VisualVM 发现内存泄漏? 【参考方案1】:

以下是我发现在调试内存泄漏时有用的几个链接:

http://olex.openlogic.com/wazi/2009/how-to-fix-memory-leaks-in-java/

http://www.ibm.com/developerworks/rational/library/05/0816_GuptaPalanki/

编辑:

您可能还想尝试: http://rejeev.blogspot.com/2009/04/analyzing-memory-leak-in-java.html

【讨论】:

【参考方案2】:

使用 VisualVM 分析堆转储和精确定位内存泄漏并不容易,如果这是您第一次处理此类问题,我不建议您使用此工具。考虑下载 HPjmeter 并让它为您完成工作。

打开转储文件后,选择 Sorted Reference Graph Subtree 选项。这将显示您的 web 应用程序中按大小排序的所有对象。在大多数内存泄漏场景中,您正在泄漏一种类型的 Object,它会随着时间的推移在堆中膨胀。 HPjmeter 将帮助您快速识别这种情况。

【讨论】:

@ Amir Afghani - 我不认为我可以使用 HPjmeter,因为我没有 HP 系统。该软件适用于 HP-UX 11i 系统。 是的,你可以。 HPjmeter 控制台是一个Java 程序。您可以在任何系统上运行它。 在 Windows 8.1 上安装失败。谷歌搜索后发现声称它与此版本的 Windows 不兼容。

以上是关于OutOfMemory 异常 - VisualVM 如何通过 heapdump 文件帮助定位内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

OutOfMemory 异常 - HDInsight LLAP 群集中的 Hive 多联接查询

未设置 TransferEncodingChunked 时 HttpClient 抛出 OutOfMemory 异常

Spark SQL createDataFrame() 引发 OutOfMemory 异常

对Java OutOfMemory异常的探究

使用Graphics.FromHwnd(…)时出现OutOfMemory异常

JVM-OutOfMemory异常重现