【问题标题】:Is there any way to analyze a truncated Java Heap Dump (hprof file)?有什么方法可以分析截断的 Java 堆转储(hprof 文件)?
【发布时间】: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.hhprof 文件有一个小标题,后跟许多 records,因此在截断的文件上,您也许可以删除最后一个(不完整的)记录,并挽救其余记录,但即使这样,您也会得到许多记录包含将在不存在的记录中声明的对象 ID...因此可能无法利用。
  • 你检查过hprof文件是否真的被截断了吗? Xmx=1g 且文件为 700mb 的事实毫无意义。
  • 我发现 yourkit 的人反应灵敏。你在他们的论坛上发过什么吗?
  • @user1410910 你能找到适合这项工作的工具吗?
  • 不,我做不到。我们刚刚从不同的环境中获得了另一个未截断的转储文件。

标签: java hprof eclipse-memory-analyzer yourkit jhat


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这如何回答这个问题? JProfiler 是否支持加载截断或损坏的堆转储?作者表示他已经尝试过 YourKit,它提供了一种与 JProfiler 非常相似的“实时”模式。所以我认为这个答案并没有太大帮助。
    • 这在我的情况下不起作用:java.io.IOException: Could not read heap dump. It seems that the data is corrupted. at com.jprofiler.core.e.b.az(ejt:1452) at com.jprofiler.core.e.b.J(ejt:1029) at com.jprofiler.core.e.e.a.a(ejt:249) at com.jprofiler.core.e.b.i(ejt:500) at com.jprofiler.core.e.b.a(ejt:235) at com.jprofiler.core.e.a.run(ejt:108) at com.jprofiler.core.e.b.aE(ejt:250)
    猜你喜欢
    • 2012-06-23
    • 2010-12-20
    • 2019-07-01
    • 2014-09-12
    • 2013-04-05
    • 2021-03-26
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    相关资源
    最近更新 更多