【问题标题】:How do I analyze a .hprof file?如何分析 .hprof 文件?
【发布时间】:2010-09-16 04:47:42
【问题描述】:

我有一个使用以下标志运行的生产服务器:-XX:+HeapDumpOnOutOfMemoryError

昨晚,当我们的服务器遇到堆错误时,它生成了一个 java-38942.hprof 文件。事实证明,系统的开发人员知道该标志,但无法从中获取任何有用的信息。

有什么想法吗?

【问题讨论】:

    标签: java profiling heap-memory


    【解决方案1】:

    我个人更喜欢 VisualVM。我喜欢 VisualVM 中的一项功能是堆转储比较。当您进行堆转储分析时,有多种方法可以找出导致崩溃的原因。我发现有用的方法之一是比较健康和不健康的堆转储。

    以下是您可以遵循的步骤:

    1. 获取 OutOfMemoryError 的堆转储让我们称其为“oome.hprof”。您可以通过 JVM 参数 HeapDumpOnOutOfMemoryError 获取此信息。
    2. 重新启动应用程序,让它运行一段时间(分钟/小时),具体取决于您的应用程序。在应用程序仍在运行时获取另一个堆转储。我们称之为“healthy.hprof”。
    3. 您可以在 VisualVM 中打开这两个转储并进行堆转储比较。您可以在类或包级别上执行此操作。这通常可以为您指明问题的方向。

    链接:https://visualvm.github.io

    【讨论】:

      【解决方案2】:

      如果您想对堆转储进行自定义分析,则有:

      这个库速度很快,但您需要用 Java 编写分析代码。

      来自文档:

      • 不在磁盘上创建任何临时文件来处理堆转储
      • 可以直接使用 GZ 压缩堆转储
      • 堆路径表示法

      【讨论】:

      • 链接不再活跃。
      【解决方案3】:

      你可以使用JHAT,JDK默认提供的Java堆分析工具。它是命令行,但会启动用于检查内存的 Web 服务器/浏览器。不是最用户友好的,但至少它已经安装在你要去的大多数地方。一个非常有用的视图是最底部的“堆直方图”链接。

      例如:jhat -port 7401 -J-Xmx4G dump.hprof

      jhat“这些天”也可以执行 OQL(底部链接“执行 OQL”)

      【讨论】:

      • 运行上述命令后,在控制台中,您将在终端中收到消息“服务器已准备好”端口:7401。之后打开此 URL:localhost:7401“您可以在浏览器窗口中查看详细信息"。
      • java.io.IOException: Version string not recognized at byte 17
      【解决方案4】:

      您还可以使用来自 Netbeans Profiler 的 HeapWalkerVisual VM 独立工具。 Visual VM 是 JHAT 的一个很好的替代品,因为它是独立的,但比 JHAT 更易于使用。

      您需要 Java 6+ 才能充分使用 Visual VM。

      【讨论】:

      • 您应该添加一个注释,这仅适用于 Java 6 和 7。
      • AFAIK、HeapWalker 和 VisualVM 不需要 Java 6/7 来读取 HPROF 文件。
      • 我刚尝试用 Java 5 加载它,它说“请使用 Java 6 或 7”我做错了什么?
      • 嗯。也许您必须运行 Java 6,但可以读取 Java 5 HPROF(也许这就是我让它工作的方式)。我知道您无法在运行 Java 5 的应用程序上从 Visual VM 创建堆转储。将更新。
      • 您也可以使用来自 java SDK 的可视化 JVM - 在 JAVASDK/bin 文件夹中查找 jvisualvm.exe
      【解决方案5】:

      YourKit Java Profiler 似乎也可以处理它们。

      【讨论】:

        【解决方案6】:

        只需获取Eclipse Memory Analyzer。没有比这更好的了,而且它是免费的。

        JHAT 仅可用于“玩具应用”

        【讨论】:

        • JHAT 是打动那些从 LILO 开始手工构建 BSD 发行版的“l33t”黑客所必需的。等等......他们无论如何都不会使用java。 :-)
        • 我认为这更像是一个评论... :\
        • 是的,JHAT 用于“玩具应用”。我有一个转储文件(9GB),JHAT 在 20GB 堆上运行了大约 30 分钟,最终因 OOM 而失败。 Eclipse 内存分析器在 1 分钟内处理了 15GB 堆。
        • 当我打开一个 3 GB 的转储文件时,Eclipse 内存分析器显示内存不足错误并且无法打开转储文件。 Windows 10/JRE17 - 在“解析来自 'D:\java_pid12269.hprof' 的堆转储”期间发生内部错误。 java.lang.OutOfMemoryError
        【解决方案7】:

        如果您想要一个相当先进的工具来做一些认真的探索,请查看 Eclipse 的 the Memory Analyzer project,由 SAP 提供。

        您可以做的一些事情对于发现内存泄漏等非常有用 - 包括针对内存中的对象运行一种受限 SQL (OQL) 形式,即

        从 com.yourcompany.somepackage.User 中选择 toString(firstName)

        太棒了。

        【讨论】:

        • 我只想为 Eclipse Memory Analyzer 添加一个 +100。我目前正在尝试筛选一个 400mb+ 的堆转储文件,在它导致 JVM 完全崩溃之前,它花了 70 多分钟来读取该文件。 EMA 可以在
        • 在使用 Eclipse 内存分析器打开 HPROF 文件时,我不断收到解析错误(实际上这些文件也被 Eclipse 转储了!)。不幸..叹息。
        • MAT 仍然需要相当多的 RAM [比 JHAT 少,但仍然相当多]。如果遇到这种情况,请参阅 stackoverflow.com/questions/7254017/… 以获取提示。
        • Error opening heap dump 'strictmode-death-penalty.hprof'. Check the error log for further details. Error opening heap dump 'strictmode-death-penalty.hprof'. Check the error log for further details. Unknown HPROF Version (JAVA PROFILE 1.0.3) (java.io.IOException) Unknown HPROF Version (JAVA PROFILE 1.0.3)
        猜你喜欢
        • 1970-01-01
        • 2014-08-01
        • 2019-07-01
        • 1970-01-01
        • 2015-02-14
        • 1970-01-01
        • 2011-03-22
        • 2023-03-11
        相关资源
        最近更新 更多