【问题标题】:How to analyze heap data from .hprof file and use it to reduce memory leaks?如何分析 .hprof 文件中的堆数据并使用它来减少内存泄漏?
【发布时间】:2017-01-25 12:02:19
【问题描述】:

最近,我在运行应用程序时遇到了java.lang.OutOfMemoryError 异常。

在一个这样的例子中,我能够使用jvisualvm 获取堆转储。

我可以使用NetBeans 8.1 IDE 打开从堆转储中获得的.hprof 堆转储文件,但我不知道如何分析数据转储。我想知道如何读取转储文件并采取纠正措施以从应用程序的角度减少内存不足异常。

【问题讨论】:

    标签: java memory-leaks out-of-memory heap-dump


    【解决方案1】:

    有很多方法可以找到内存泄漏的根本原因,例如使用诸如JProfiler 之类的分析器并简单地应用this great video 中描述的内容。您还可以查看 Eclipse Memory Analyzer,也称为 MAT,它能够分析您的堆转储并提出内存泄漏的潜在原因,如您在 this video 中所见(您可以找到有关嫌疑人报告here的更多信息。另一种方法是通过应用this approach 来使用Java Flight Recorder。或者使用 JVisualVM 使用this video 中描述的方法。

    【讨论】:

    • 您能否推荐一个与其他工具类似的 MAT 视频教程?
    • 我能够使用 MAT 工具获取泄漏嫌疑人报告,但是,该列表仅包含原始类,例如它说 Java.util.vector 如何将其跟踪到应用程序的类以便堵塞泄漏?
    • 请将您的报告添加到您的问题中
    • 附上组件报告
    • 这是您需要生成的泄漏嫌疑人报告,如我在答案中提供的视频所示
    【解决方案2】:

    大多数时候,您只需要知道哪些类最容易占用内存。您可以使用: jmap -histo 针对正在运行的进程,如果它是一个大型 JVM,这很方便......您不想摆弄大型堆转储文件。它必须以拥有该进程的同一 Linux 用户身份运行,例如在 Linux 中你可以使用:

    sudo -u <user> jmap -histo <pid>
    

    显然“histo”是“histogram”的缩写。这会将直方图转储到标准输出,因此您可能希望将其通过管道传输到文件进行分析。它将按实例数 * 实例大小排序,因此请查看前 10 个条目,您可能会有答案。

    【讨论】:

      【解决方案3】:

      一般来说,基本上你所做的就是分析“什么是使用最多的 RAM”?然后当你弄清楚这一点时(并且“这可能是我用完 RAM 的问题吗?”)然后你试着弄清楚为什么周围有这么多这样的对象。它们是否被持有对象但不需要的东西引用?或者那是不小心持有不应该的事情的参考?您是否使用了太大的架构/范式(例如:将“所有内容存储在一个大数组中”)?您的数据库客户端是否在返回大型 ResultSet 之前将它们“缓冲”到 RAM 中?等等……

      【讨论】:

        【解决方案4】:

        这个案例你需要的工具是这个应用程序:

        Memory Analyzer Tool

        只需下载并启动,然后加载您的 hprof 文件。这可能需要一两分钟,具体取决于 hprof 的大小,但随后您将看到关于您的内存使用情况的很好的分析。它非常易于使用,并自动突出潜在的内存泄漏,从不同角度对数据进行分析。

        当我处理重要的内存问题时,我只使用 MAT,据我所知,我解决了所有这些问题。

        【讨论】:

        • 我能够使用 MAT 工具获取泄漏嫌疑人报告,但是,该列表仅包含原始类,例如它说 Java.util.vector 如何将其跟踪到应用程序的类以便堵塞泄漏?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-02
        • 2013-05-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多