有没有办法分析截断的Java堆转储(hprof文件)?

use*_*910 11 java jhat yourkit hprof eclipse-memory-analyzer

在我的工作中,我们遇到了难以重现的OOM问题.或者,更准确地说,它很容易在一个系统上重现,使得该系统无法使用,但在相同的输入下难以在其他任何地方重现.

应用程序使用服务包装器作为服务运行.我们确实设法更改配置以启动它,并选择在OOM上输出堆转储文件,但不幸的是,它们被截断,很可能是由于服务包装器超时并在写入文件时终止进程.这很明显,因为最大内存设置为1GB,而hprof文件小到700MB,这对于OOM上的整个堆来说太小了.

需要花费大量资金来进一步配置包装器以使java进程有更长的时间来写出堆,但我们正在使用这两个选项来实现这一点:

wrapper.jvm_exit.timeout=600
wrapper.shutdown.timeout=600
Run Code Online (Sandbox Code Playgroud)

问题是,我能用截断的hprof文件做些什么有用吗?Eclipse MAT扼杀它们.Jhat似乎加载了它们,但随后只显示了3个大小为0的Java.Object实例.我试过YourKit,它无法写出它的oids文件.

在我看来,这些文件应该包含一些有用的,可访问的信息.有没有一个工具可以读取那里有什么?

感谢您的时间!

小智 -3

使用 Jpofiler( https://www.ejtechnologies.com/products/jprofiler/overview.html)。它不是免费的,但是有试用期。

实时内存和 CPU 视图选项是隔离问题的最佳选择。即使在大型垃圾场上,它通常也运行得相当好。

  • 这如何回答这个问题?JProfiler 是否支持加载被截断或损坏的堆转储?作者表示他已经尝试过 YourKit,它提供了与 JProfiler 非常相似的“实时”模式。所以我认为这个答案并没有多大帮助。 (4认同)