首页 > 解决方案 > 如何避免在 OutOfMemoryError 后停止实验?

问题描述

我正在运行数千个实验,其中一些可以抛出OutOfMemoryError. 问题是当一个这样的实验抛出这个错误时,程序会完全停止。如果抛出这样的错误,我怎样才能使程序继续下一个实验?

我正在考虑捕捉错误,并强制垃圾收集器(比如这里谈到的Is it possible to catch out of memory exception in java?),这是个好主意吗?

标签: javagarbage-collectiontry-catchout-of-memory

解决方案


这是一个好主意吗?

这是个坏主意。

OutOfMemoryError对另一个问题的回答中,我解释了捕获可能不允许应用程序正确恢复的一些原因。(这取决于应用程序的性质和内存不足的真正原因。)


我正在考虑捕捉错误,并强制垃圾收集器

在您的场景中“强制”垃圾收集是没有意义的。如果您的一项实验因 OOME 而失败,您可以确信 GC 刚刚运行......并且无法找到足够的可用内存来继续。现在,在 OOME 被抛出和你抓住它之间,你会发现一些通过实验堆栈帧可以访问的对象现在是如何无法访问的。JVM 将通过运行 GC 本身来处理这个问题。


我认为解决您的问题的更好方法是使您的应用程序可重新启动。让它记录(在文件中!)完成的实验和失败的实验。当发生 OOME 时,将其记录在文件中。然后,您向您的应用程序添加“重新启动下一个实验”功能,并编写一个轻量级包装脚本来重复运行 Java 应用程序,直到它完成。

通过在新的 JVM 中重新启动,您可以避免处理 OOME 可能造成的损害;例如,当您有多个线程时。而且您还可以为由内存泄漏引起的 OOME 提供“创可贴”。最后,您可能会发现实验在干净/空堆中运行得更快。


推荐阅读