【发布时间】:2017-11-19 17:38:26
【问题描述】:
在我的工作中,我们遇到了难以重现的 OOM 问题。或者,更准确地说,它很容易在一个系统上重现,使该系统无法使用,但在给定相同输入的情况下很难在其他任何地方重现。
应用程序正在使用服务包装器作为服务运行。我们确实设法更改了配置以通过在 OOM 上输出堆转储文件的选项来启动它,但不幸的是,它们被截断了,很可能是由于服务包装器在写入文件时超时并终止了进程。这很明显,因为最大内存设置为 1GB,而 hprof 文件小到 700MB,这对于 OOM 上的整个堆来说太小了。
要额外配置包装器以使 java 进程有更长的时间来写出堆,需要花费很多时间,但我们正在使用以下 2 个选项来实现这一点:
wrapper.jvm_exit.timeout=600
wrapper.shutdown.timeout=600
问题是,我可以对截断的 hprof 文件做些什么有用的事情吗? Eclipse MAT 让他们窒息。 Jhat 似乎加载了它们,但随后只显示了 3 个大小为 0 的 Java.Object 实例,没有别的。我试过YourKit,它不能写它的oids文件。
在我看来,这些文件中应该包含一些有用的、可访问的信息。有什么工具可以读取那里的内容吗?
感谢您的宝贵时间!
【问题讨论】:
-
这是一个link to the "spec", described in
hprof_b_spec.h。hprof文件有一个小标题,后跟许多records,因此在截断的文件上,您也许可以删除最后一个(不完整的)记录,并挽救其余记录,但即使这样,您也会得到许多记录包含将在不存在的记录中声明的对象 ID...因此可能无法利用。 -
你检查过hprof文件是否真的被截断了吗? Xmx=1g 且文件为 700mb 的事实毫无意义。
-
我发现 yourkit 的人反应灵敏。你在他们的论坛上发过什么吗?
-
@user1410910 你能找到适合这项工作的工具吗?
-
不,我做不到。我们刚刚从不同的环境中获得了另一个未截断的转储文件。
标签: java hprof eclipse-memory-analyzer yourkit jhat