在我的工作中,我们遇到了难以重现的OOM问题。或者,更准确地说,它很容易在一个系统上重现,使得该系统无法使用,但在相同输入的情况下难以在其他任何地方重现。
使用服务包装器将应用程序作为服务运行。我们确实设法更改配置以启动它,并选择在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文件。
在我看来,这些文件应该包含一些有用的,可访问的信息。有没有可以读取内容的工具?
感谢您的时间!
答案 0 :(得分:1)
分析我遇到的转储文件的最佳选择是文本编辑器,如vim。
答案 1 :(得分:-1)
使用Jpofiler(this)。它不是免费的,但它有一个试用期。
实时内存和CPU视图选项是隔离问题的最佳选择。它通常在大型垃圾场上运行得相当好。