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

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

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

另外配置包装器以给java进程更长的时间来写出堆需要很多跳跃,但是我们正在使用以下2个选项来追求这一点:

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

问题是,对于我拥有的截断的hprof文件,我能做些什么有用的事情吗?Eclipse MAT窒息在他们身上。Jhat 似乎加载了它们,但随后只显示了大小为 0 的 Java.Object 的 3 个实例,而没有显示其他任何内容。我尝试了YourKit,它无法写入其oids文件。

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

感谢您抽出宝贵时间接受采访!


答案 1

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


答案 2

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

实时内存和 CPU 视图选项是隔离问题的最佳选择。即使在大型转储上,它通常也能正常运行。


推荐