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



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

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

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

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

问题是,我可以用截断的 hprof 文件做什么有用的事情吗?日食垫子窒息了他们。Jhat似乎加载了它们,但随后只显示了3个大小为0的Java.Object实例,没有其他任何内容。我尝试了YourKit,它无法写入其oids文件。

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

谢谢你的时间!

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

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

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

相关内容

  • 没有找到相关文章