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

时间:2009-10-05 08:31:39

标签: java hprof

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

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

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

有关转储主题的更多信息,请参阅Eclipse MemoryAnalyser