254

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

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

有任何想法吗?

4

7 回答 7

239

如果您想要一个相当先进的工具来进行一些认真的探索,请查看Eclipse的 Memory Analyzer 项目,该项目由 SAP 提供。

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

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

完全辉煌。

于 2008-10-09T04:41:31.313 回答
84

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

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

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

于 2008-10-09T04:17:01.393 回答
38

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

您需要 Java 6+ 才能充分使用 Visual VM。

于 2008-10-09T16:41:06.120 回答
15

只需获取Eclipse Memory Analyzer 即可。没有比这更好的了,而且它是免费的。

JHAT 仅可用于“玩具应用”

于 2008-10-09T08:18:40.267 回答
11

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

于 2010-11-02T10:35:48.283 回答
11

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

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

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

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

于 2020-03-04T08:58:12.567 回答
7

如果您想对 heapdump 进行自定义分析,那么有:

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

从文档:

  • 不在磁盘上创建任何临时文件来处理堆转储
  • 可以直接工作 GZ 压缩堆转储
  • 堆路径表示法
于 2018-06-06T11:24:34.800 回答