如何分析.hprof文件?

Nic*_*tes 213 java heap profiling

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

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

有任何想法吗?

Cow*_*wan 199

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

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

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

完全辉煌.

  • 我只想为Eclipse Memory Analyzer添加+100.我目前正在尝试通过一个400mb +堆转储文件进行筛选,并且在它导致完整的JVM崩溃之前花了超过70分钟来读取该文件.EMA能够在<5分钟内打开它. (16认同)
  • 太糟糕的MAT经常无法阅读堆...... :-( (3认同)
  • 使用Eclipse Memory Analyzer打开HPROF文件时,我一直在解析错误(实际上它也被Eclipse转储了!).不幸......叹了口气. (3认同)
  • MAT仍然需要相当多的RAM [少于JHAT,但仍然相当多].如果遇到这种情况,请参阅http://stackoverflow.com/questions/7254017/tool-for-analyzing-large-java-heap-dumps以获取提示. (3认同)

CMS*_*CMS 69

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

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

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

  • 运行上述命令后,在控制台中,您将在终端“服务器准备好”端口:7401 中收到消息。然后打开此 URL:http://localhost:7401“您可以在浏览器窗口中看到详细信息”。 (2认同)

Jam*_*hek 34

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

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


koh*_*erm 11

只需获取Eclipse Memory Analyzer.那里没什么好的,而且是免费的.

JHAT仅适用于"玩具应用"

  • JHAT是打动那些从LILO开始手工制作BSD发行版的"l33t"黑客的必要条件.等等......他们永远不会使用java.:-) (3认同)

小智 10

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


And*_*ejs 5

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

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

从文档:

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


Wal*_*eed 5

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

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

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

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