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

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

什么好主意吗?


当前回答

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

其他回答

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

jhat -port 7401 -J-Xmx4G dump.hprof

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

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

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

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

如果您想要一个相当高级的工具来做一些严肃的研究,可以看看Eclipse中的Memory Analyzer项目,该项目由SAP提供。

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

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

完全的。

只需获得Eclipse内存分析器。没有比这更好的了,而且是免费的。

JHAT只能用于“玩具应用程序”