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

Java -XX:+;HeapDumpOnAutofMemoryError未在OOM中创建hprof文件,java,hprof,Java,Hprof,我使用以下参数启动java代码(Vista中的1.6.0_16)-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=../logs。我运行代码,我可以在日志中看到有两个OOM 我知道的第一个原因是我可以在标准输出中看到正在创建hprof文件: java.lang.OutOfMemoryError: Java heap space Dumping heap to ../logs\java_pid4604.hprof ... Heap dump file

我使用以下参数启动java代码(Vista中的1.6.0_16)
-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=../logs
。我运行代码,我可以在日志中看到有两个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异常吗?

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

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


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

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


有关倾销问题的更多信息,请阅读。

我知道关于不要试图从OOM中恢复的建议,但在这种情况下,我需要,必须,而且在许多情况下都很有效。但是你的hipothesys听起来不错,也许只有一个是故意创造的。。。在研究这个问题时,我在stackoverlfow中发现了一些问题,说明了如何通过编程创建转储,但现在找不到