【发布时间】:2010-09-16 04:47:42
【问题描述】:
我有一个使用以下标志运行的生产服务器:-XX:+HeapDumpOnOutOfMemoryError
昨晚,当我们的服务器遇到堆错误时,它生成了一个 java-38942.hprof 文件。事实证明,系统的开发人员知道该标志,但无法从中获取任何有用的信息。
有什么想法吗?
【问题讨论】:
标签: java profiling heap-memory
我有一个使用以下标志运行的生产服务器:-XX:+HeapDumpOnOutOfMemoryError
昨晚,当我们的服务器遇到堆错误时,它生成了一个 java-38942.hprof 文件。事实证明,系统的开发人员知道该标志,但无法从中获取任何有用的信息。
有什么想法吗?
【问题讨论】:
标签: java profiling heap-memory
我个人更喜欢 VisualVM。我喜欢 VisualVM 中的一项功能是堆转储比较。当您进行堆转储分析时,有多种方法可以找出导致崩溃的原因。我发现有用的方法之一是比较健康和不健康的堆转储。
以下是您可以遵循的步骤:
【讨论】:
如果您想对堆转储进行自定义分析,则有:
这个库速度很快,但您需要用 Java 编写分析代码。
来自文档:
【讨论】:
你可以使用JHAT,JDK默认提供的Java堆分析工具。它是命令行,但会启动用于检查内存的 Web 服务器/浏览器。不是最用户友好的,但至少它已经安装在你要去的大多数地方。一个非常有用的视图是最底部的“堆直方图”链接。
例如:jhat -port 7401 -J-Xmx4G dump.hprof
jhat“这些天”也可以执行 OQL(底部链接“执行 OQL”)
【讨论】:
java.io.IOException: Version string not recognized at byte 17
您还可以使用来自 Netbeans Profiler 的 HeapWalker 或 Visual VM 独立工具。 Visual VM 是 JHAT 的一个很好的替代品,因为它是独立的,但比 JHAT 更易于使用。
您需要 Java 6+ 才能充分使用 Visual VM。
【讨论】:
JAVASDK/bin 文件夹中查找 jvisualvm.exe
YourKit Java Profiler 似乎也可以处理它们。
【讨论】:
只需获取Eclipse Memory Analyzer。没有比这更好的了,而且它是免费的。
JHAT 仅可用于“玩具应用”
【讨论】:
如果您想要一个相当先进的工具来做一些认真的探索,请查看 Eclipse 的 the Memory Analyzer project,由 SAP 提供。
您可以做的一些事情对于发现内存泄漏等非常有用 - 包括针对内存中的对象运行一种受限 SQL (OQL) 形式,即
从 com.yourcompany.somepackage.User 中选择 toString(firstName)
太棒了。
【讨论】:
Error opening heap dump 'strictmode-death-penalty.hprof'. Check the error log for further details. Error opening heap dump 'strictmode-death-penalty.hprof'. Check the error log for further details. Unknown HPROF Version (JAVA PROFILE 1.0.3) (java.io.IOException) Unknown HPROF Version (JAVA PROFILE 1.0.3)