我有一个生产服务器运行以下标志:-XX: + HeapDumpOnOutOfMemoryError
昨晚它生成了一个java-38942。当我们的服务器遇到堆错误时,Hprof文件。事实证明,系统的开发人员知道这个标志,但无法从中获得任何有用的信息。
什么好主意吗?
可以使用JDK默认提供的Java堆分析工具JHAT。它是命令行,但会启动一个web服务器/浏览器,用于检查内存。不是最友好的用户,但至少它已经安装在大多数地方,你会去。一个非常有用的视图是“堆直方图”。链接在最下面。
例:jhat -port 7401 -J-Xmx4G dump.hprof
jhat -port 7401 -J-Xmx4G dump.hprof
jhat现在可以执行OQL了。以及(底部链接&;execute OQL")
jhat
如果你想要一个相当高级的工具来做一些认真的调查,看看Eclipse中的内存分析器项目,由SAP贡献。
您可以做的一些事情对于查找内存泄漏等非常有用——包括对内存中的对象运行一种有限SQL (OQL)形式,例如:
SELECT toString(firstName) FROM com.yourcompany.somepackage.User
完全的。
只要得到Eclipse内存分析器。没有比这更好的了,而且是免费的。
JHAT只能用于“玩具应用程序”
你也可以从Netbeans分析器或视觉VM独立工具中使用HeapWalker。Visual VM是JHAT的一个很好的替代方案,因为它是独立的,但是比JHAT更容易使用。
您需要Java 6+才能完全使用Visual VM。
YourKit Java Profiler似乎也可以处理它们。
如果你想对你的堆转储进行自定义分析,那么有:
这个库速度很快,但是您需要用Java编写分析代码。
从文档中可以看出:
我个人更喜欢VisualVM。我喜欢VisualVM中的一个特性是堆转储比较。在进行堆转储分析时,有多种方法可以找出导致崩溃的原因。我发现有用的方法之一是对健康堆转储和不健康堆转储进行比较。
以下是你可以遵循的步骤:
链接:https://visualvm.github.io