This thread,并this page:JVM是否保证在抛出OutOfMemoryError之前运行GC?
它,除非JVM试图完整垃圾回收 第一,包括取消轻声/弱引用对象的[
OutOfMemoryError
]将永远不会被抛出。
至于这一段代码,
//.. allocate reserved memory
try {
//.. calculation which requires alot of memory even after optimized
} catch (java.lang.OutOfMemoryError e){
System.gc();
//.. hedge recovery
}
是调用System.gc()
多余的?
是否已经保证 JVM(根据JVMS)在投掷前已经运行了GC java.lang.OutOfMemoryError
?
再次:对System.gc()的调用几乎没有必要或实际上有帮助。 – Matthias 2012-01-06 09:42:39
这不是一个答案,所以将它作为评论:你不应该尝试在OOM之后“恢复”。 OOM意味着一些对象无法被创建。不仅在您的应用程序中:也在图书馆中。这意味着,您的应用程序处于严重中断状态 - 无法找出中断的情况。你可以做的最好的是让应用程序死掉,并处理重新启动*外部*。 – alf 2012-01-06 09:43:39
@alf:你确定它会让应用程序处于严重中断状态吗?你不会有“半建”实例或“半装”类,对吗?它应该仍然是“理智的”,或者不像其他类型的例外。 – Thilo 2012-01-06 09:58:12