如何分析.hprof文件?

时间:2008-10-09 04:04:03

标签: java profiling heap

我的生产服务器运行时带有以下标志: - XX:+ HeapDumpOnOutOfMemoryError

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

有什么想法吗?

7 个答案:

答案 0 :(得分:189)

如果你想要一个相当高级的工具来做一些严肃的工作,请查看Eclipse的the Memory Analyzer project,由SAP为他们做出贡献。

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

  

SELECT toString(firstName)FROM com.yourcompany.somepackage.User

完全辉煌。

答案 1 :(得分:57)

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

ex:jhat -port 7401 -J-Xmx4G dump.hprof

jhat也可以“执行OQL”(底层链接“执行OQL”)

答案 2 :(得分:32)

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

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

答案 3 :(得分:11)

得到Eclipse Memory Analyzer。那里没什么好的,而且是免费的。

JHAT仅适用于“玩具应用”

答案 4 :(得分:7)

YourKit Java Profiler似乎也在处理它们。

答案 5 :(得分:5)

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

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

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

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

答案 6 :(得分:2)

如果你想对你的heapdump进行自定义分析,那么就有了:

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

来自文档:

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