代码之家  ›  专栏  ›  技术社区  ›  Persimmonium

-XX:+HeapDumpOnAutofMemoryError未在OOM中创建hprof文件

  •  4
  • Persimmonium  · 技术社区  · 15 年前

    我用下面的参数来启动我的Java代码(1.60EY16在Vista) -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../logs . 我运行代码,在日志中可以看到有两个OOM。

    我知道的第一个原因是在stdout中可以看到正在创建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异常吗?

    2 回复  |  直到 9 年前
        1
  •  2
  •   Jim Nordlander    14 年前

    内存不足时,第一个错误只生成一个转储文件。如果你想得到更多,你可以尝试jmap或者在jvm上保留jconsole(版本6),那么你可以在一切崩溃之后,也就是在早上从jconsole(或者你选择的分析器工具)创建你自己的转储文件。

    关于倾销的更多内容可以阅读 Eclipse MemoryAnalyser .

        2
  •  5
  •   sfussenegger    15 年前

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

    关于您的问题,我怀疑-xx:+heapDumpOnAutofMemoryError只是有意创建一个转储来防止多个堆转储:只需考虑几个线程同时抛出一个OOME,从而为每个抛出的异常生成一个堆转储。

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