如何分析.hprof文件?


227

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

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

有任何想法吗?

Answers:


215

如果您想要一个相当先进的工具来认真研究一下,请查看Eclipse 的Memory Analyzer项目该项目由SAP贡献。

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

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

完全辉煌。


18
我只想为Eclipse Memory Analyzer添加+100。我目前正在尝试筛选一个400mb +的堆转储文件,并且在导致完全JVM崩溃之前,jat花费了超过70分钟的时间来读取该文件。EMA可以在5分钟内打开它。
马特b

3
使用Eclipse内存分析器打开HPROF文件时,我总是遇到解析错误(实际上,这也被Eclipse转储了!)。不幸的是..
lost_bits1110 2011年

3
MAT仍然需要相当多的RAM [比JHAT少,但还需要很多]。如果遇到这种情况,请参见stackoverflow.com/questions/7254017/…以获得提示。
rogerdpack 2015年

71

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

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

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


在控制台上运行上述命令后,您将收到以下消息:终端“服务器已就绪”端口:7401。打开此URL后: localhost:7401 “您可以在浏览器窗口中查看详细信息”。
Laxman G

35

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

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


您应该添加一条注释,该注释仅适用于Java 6和7。
Nick Stinemates,

AFAIK,HeapWalker和VisualVM不需要Java 6/7即可读取HPROF文件。
詹姆斯·谢克

我只是尝试用Java 5加载它,并说“请使用Java 6或7”,我在做什么错?
Nick Stinemates

嗯 也许您必须运行Java 6,但可以读取Java 5 HPROF(也许这就是我使其工作的方式)。我知道您无法在运行Java 5的应用程序上从Visual VM创建堆转储。将会更新。
James Schek

您也可以使用可视化JVM,从Java SDK -寻找jvisualvm.exeJAVASDK/bin文件夹
xxxvodnikxxx

11

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

JHAT仅可用于“玩具应用程序”


3
对于那些从LILO开始手工构建BSD发行版的“ l33t”黑客来说,JHAT必不可少。等等...他们绝对不会使用Java。:-)
James Schek

我认为这更像是一条评论...:\
rogerdpack



2

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.