我开始我的Java代码(1.6.0_16在Vista)具有以下PARAMS(等等) -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异常?
出内存产生的第一个错误只有一个转储文件。 如果你想获得更多的你可以尝试JMAP或保持JConsole的在JVM(第6版),那么你可以以后一切都在上午即坠毁的JConsole(或者你选择的分析工具)创建自己的转储。
更多关于倾销主题可以读的Eclipse MemoryAnalyser 。
我不会尝试从一个OutOfMemoryError恢复一些对象可能处于不确定状态结束(只是想着那不可能的数组分配存储日期比如一个ArrayList)。
关于你的问题,我怀疑是-XX:+ HeapDumpOnOutOfMemoryError只创建一个单一转储故意以防止多个堆转储:想想多个线程在同一时间抛出OOME,造成堆转储每个抛出的异常。
作为总结:不要试图从OOME恢复,不要指望JVM写多单堆转储更多。 但是,如果你仍然觉得有必要产生堆转储,你可以尝试手动处理的OOME异常并致电JMAP创建转储或使用“-XX:+ HeapDumpOnCtrlBreak”(不知道不过,如何模拟CtrlBreak编程) 。