如何避免实验在 OutOfMemoryError 后停止?

How to avoid experiments stopping after an OutOfMemoryError?

我进行了 运行 几千次实验,其中一些可以抛出一个 OutOfMemoryError。问题是当一个这样的实验抛出这个错误时,程序完全停止了。如果抛出这样的错误,我怎样才能让程序继续下一个实验?

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

Is this a good idea?

这是个坏主意。

my answer 的另一个问题中,我解释了捕获 OutOfMemoryError 可能无法使应用程序正常恢复的一些原因。 (这取决于应用程序的性质及其 运行 内存不足的真正原因。)


I'm thinking about catching the error, and forcing the garbage collector

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


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

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