有什么方法可以分析截断的Java堆转储(hprof文件)?

问题描述:

在我的工作中,我们遇到了难以重现OOM问题。或者更准确地说,在一个系统上重现非常容易,使得该系统无法使用,但在给定相同输入的情况下难以在其他任何地方重现。有什么方法可以分析截断的Java堆转储(hprof文件)?

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

这将需要大量的铁圈跳的另外配置包装给Java进程更长的时间来写堆出来的,但我们使用这两个选项追求这样的:

wrapper.jvm_exit.timeout=600 
wrapper.shutdown.timeout=600 

的问题是,有什么有用的,我可以用我截断的hprof文件做什么? Eclipse MAT呛他们。 Jhat似乎加载它们,但是只显示3个大小为0的Java.Object实例,没有其他的东西。我试过YourKit,它不能写它的oids文件。

在我看来,这些文件应该有一些有用的,可访问的信息。有没有一种工具可以读取那里的内容?

谢谢你的时间!

+2

这里值得一提的是[链接到'hprof_b_spec.h'中描述的“spec”](http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/6ff36c6e0cf4/src/共享/演示/ JVMTI/HPROF/hprof_b_spec.h)。一个'hprof'文件有一个小标题,后面跟着许多'record's,所以在一个截断的文件中,你可能会删除最后一个(不完整)的记录,并挽救其余的记录,但即使如此,你会得到很多记录,包含将在缺席记录中声明的对象ID ......因此可能无法解决。 –

+1

您是否检查过hprof文件是否真的被截断? Xmx = 1g和文件为700mb的事实并不意味着什么。 –

+0

我发现了这个工具包的人们超级响应。你有没有在他们的论坛发布任何内容 –

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

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

+3

这是如何回答问题的? JProfiler是否支持加载截断或损坏的堆转储?作者说他已经尝试过YourKit,它提供了一个与JProfiler非常相似的“实时”模式。所以这个答案在我看来并没有太大的帮助。 – cello

分析直到我遇到的转储文件的最佳选择是像vim这样的文本编辑器。