代码之家  ›  专栏  ›  技术社区  ›  Nick Stinemates

如何分析.hprof文件?

  •  268
  • Nick Stinemates  · 技术社区  · 17 年前

    我有一个运行有以下标志的生产服务器:- XX: +HeapDumpOnOutOfMemory错误

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

    有什么想法吗?

    7 回复  |  直到 5 年前
        1
  •  185
  •   Cowan    17 年前

    如果你想要一个相当先进的工具来做一些严肃的探索,看看 the Memory Analyzer project SAP为Eclipse做出了贡献。

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

    从com.yourcompany.some包中选择字符串(名字)。用户

    太棒了。

        2
  •  50
  •   rogerdpack    8 年前

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

    前任: jhat -port 7401 -J-Xmx4G dump.hprof

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

        3
  •  31
  •   moxi    9 年前

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

    您需要Java 6+才能完全使用Visual VM。

        4
  •  10
  •   kohlerm    17 年前

    只要得到 Eclipse Memory Analyzer 没有比这更好的了,而且是免费的。

    JHAT仅适用于“玩具应用”

        5
  •  7
  •   Polaris    15 年前

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

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

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

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

        6
  •  1
  •   Andrejs    8 年前

    YourKit Java Profiler似乎也能处理这些问题。