6

我使用以下参数(以及其他参数)开始我的 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异常吗?

4

2 回答 2

8

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

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

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

于 2009-10-05T09:47:50.420 回答
5

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

可以在Eclipse MemoryAnalyser中阅读有关转储主题的更多信息。

于 2011-03-02T10:02:06.897 回答