我使用以下参数(以及其他参数)启动我的java代码(Vista中的1.6.0_16)-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]
Run Code Online (Sandbox Code Playgroud)
然后,在代码结束时我得到另一个OOM,我捕获了这个,但是我没有创建第二个hprof文件.谁知道为什么?是因为我抓住了OOM例外吗?
我不会尝试从OutOfMemoryError中恢复,因为某些对象可能最终处于未定义状态(仅考虑一个无法分配其数组以存储日期的ArrayList).
关于你的问题,我怀疑-XX:+ HeapDumpOnOutOfMemoryError只是故意创建一个转储以防止多个堆转储:只考虑几个线程同时抛出一个OOME,导致每个抛出异常的堆转储.
总结:不要尝试从OOME恢复,也不要指望JVM写入多个堆转储.但是,如果您仍然觉得需要生成堆转储,您可以尝试手动处理OOME异常并调用jmap创建转储或使用"-XX:+ HeapDumpOnCtrlBreak"(不确定,如何以编程方式模拟CtrlBreak) .
小智 5
内存不足在第一个错误时只生成一个转储文件。如果您想获得更多,您可以尝试 jmap 或将 jconsole 保留在 jvm(版本 6)上,然后您可以在一切崩溃后即在早上从 jconsole(或您选择的分析器工具)创建您自己的转储。
可以在Eclipse MemoryAnalyser 中阅读有关转储主题的更多信息。
| 归档时间: |
|
| 查看次数: |
14830 次 |
| 最近记录: |