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

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

什么好主意吗?


当前回答

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

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

其他回答

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

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

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

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

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

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

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

如果你想对你的堆转储进行自定义分析,那么有:

JVM堆转储分析库https://github.com/aragozin/heaplib/tree/master/hprof-heap

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

从文档中可以看出:

没有在磁盘上创建任何临时文件来处理堆转储 可以直接工作GZ压缩堆转储 HeapPath符号

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

jhat -port 7401 -J-Xmx4G dump.hprof

jhat“现在”也可以执行OQL了(底部链接“执行OQL”)