【问题标题】:-XX:+HeapDumpOnOutOfMemoryError not creating hprof file in OOM-XX:+HeapDumpOnOutOfMemoryError 不在 OOM 中创建 hprof 文件
【发布时间】:2015-10-16 02:52:01
【问题描述】:

我使用以下参数(以及其他参数)-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../logs 开始我的 java 代码(Vista 中的 1.6.0_16)。我运行代码,在日志中可以看到有两个OOM。

我知道的第一个是因为我可以在标准输出中看到正在创建 hprof 文件:

java.lang.OutOfMemoryError: Java heap space
Dumping heap to ../logs\java_pid4604.hprof ...
Heap dump file created [37351818 bytes in 1.635 secs]

然后,在代码的最后,我得到另一个 OOM,我捕获了这个,但我没有创建第二个 hprof 文件。有谁知道这是为什么??是不是因为我捕获了OOM异常?

【问题讨论】:

    标签: java hprof


    【解决方案1】:

    我不会尝试从 OutOfMemoryError 中恢复,因为某些对象可能最终处于未定义状态(例如,考虑一个无法分配其数组来存储日期的 ArrayList)。

    关于您的问题,我怀疑 -XX:+HeapDumpOnOutOfMemoryError 只是故意创建一个转储以防止多个堆转储:只需考虑几个线程同时抛出 OOME,导致每个抛出的堆转储例外。

    总结一下:不要试图从 OOME 中恢复,也不要期望 JVM 写入多个堆转储。但是,如果您仍然觉得需要生成堆转储,您可以尝试手动处理 OOME 异常并调用 jmap 来创建转储或使用“-XX:+HeapDumpOnCtrlBreak”(虽然不确定,如何以编程方式模拟 CtrlBreak) .

    【讨论】:

    • 我知道建议不要尝试从 OOM 中恢复,但在这种情况下,我需要、必须这样做,而且在许多情况下一切正常。但是您的 hipothesys 听起来不错,也许只有一个是故意创建的...在研究此问题时,我在 stackoverlfow 中发现了一些问题,该问题显示了如何以编程方式创建转储,但现在找不到
    【解决方案2】:

    内存不足仅在第一个错误时生成一个转储文件。如果您想获得更多信息,可以尝试 jmap 或将 jconsole 保留在 jvm(版本 6)上,然后您可以在一切都崩溃后,即早上从 jconsole(或您选择的分析器工具)创建自己的转储。

    关于倾销主题的更多信息可以在Eclipse MemoryAnalyser阅读。

    【讨论】:

      猜你喜欢
      • 2019-03-14
      • 1970-01-01
      • 2020-11-11
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      相关资源
      最近更新 更多