我有一个使用以下标志运行的生产服务器: - XX:+ HeapDumpOnOutOfMemoryError
昨晚它在我们的服务器遇到堆错误时生成了一个java-38942.hprof文件.事实证明,系统的开发人员知道标志,但无法从中获取任何有用的信息.
有任何想法吗?
如果你想要一个相当高级的工具来做一些严肃的工作,请查看Eclipse 的Memory Analyzer项目,由SAP为他们做出贡献.
您可以做的一些事情非常适合查找内存泄漏等 - 包括针对内存中对象运行一种有限的SQL(OQL)形式,即
SELECT toString(firstName)FROM com.yourcompany.somepackage.User
完全辉煌.
您可以使用JHAT,默认情况下与JDK一起提供的Java堆分析工具.它是命令行,但启动用于检查内存的Web服务器/浏览器.不是最友好的用户,但至少已经安装了大多数你会去的地方.一个非常有用的视图是最底层的"堆直方图"链接.
例如: jhat -port 7401 -J-Xmx4G dump.hprof
jhat
也可以"执行"这些天的OQL(底部链接"执行OQL")
您还可以使用Netbeans Profiler中的HeapWalker或Visual VM独立工具.Visual VM是JHAT的一个很好的替代品,因为它是独立的,但比JHAT更容易使用.
您需要Java 6+才能完全使用Visual VM.
只需获取Eclipse Memory Analyzer.那里没什么好的,而且是免费的.
JHAT仅适用于"玩具应用"
YourKit Java Profiler似乎也在处理它们.
如果您想对堆转储进行自定义分析,则有:
JVM堆转储分析库 https://github.com/aragozin/jvm-tools/tree/master/hprof-heap
这个库很快,但是您将需要用Java编写分析代码。
从文档:
不在磁盘上创建任何临时文件来处理堆转储
可以直接使用GZ压缩堆转储
HeapPath表示法