java - 如何避免在 OutOfMemoryError 后停止实验?
问题描述
我正在运行数千个实验,其中一些可以抛出OutOfMemoryError
. 问题是当一个这样的实验抛出这个错误时,程序会完全停止。如果抛出这样的错误,我怎样才能使程序继续下一个实验?
我正在考虑捕捉错误,并强制垃圾收集器(比如这里谈到的Is it possible to catch out of memory exception in java?),这是个好主意吗?
解决方案
这是一个好主意吗?
这是个坏主意。
在我OutOfMemoryError
对另一个问题的回答中,我解释了捕获可能不允许应用程序正确恢复的一些原因。(这取决于应用程序的性质和内存不足的真正原因。)
我正在考虑捕捉错误,并强制垃圾收集器
在您的场景中“强制”垃圾收集是没有意义的。如果您的一项实验因 OOME 而失败,您可以确信 GC 刚刚运行......并且无法找到足够的可用内存来继续。现在,在 OOME 被抛出和你抓住它之间,你会发现一些通过实验堆栈帧可以访问的对象现在是如何无法访问的。JVM 将通过运行 GC 本身来处理这个问题。
我认为解决您的问题的更好方法是使您的应用程序可重新启动。让它记录(在文件中!)完成的实验和失败的实验。当发生 OOME 时,将其记录在文件中。然后,您向您的应用程序添加“重新启动下一个实验”功能,并编写一个轻量级包装脚本来重复运行 Java 应用程序,直到它完成。
通过在新的 JVM 中重新启动,您可以避免处理 OOME 可能造成的损害;例如,当您有多个线程时。而且您还可以为由内存泄漏引起的 OOME 提供“创可贴”。最后,您可能会发现实验在干净/空堆中运行得更快。
推荐阅读
- abap - AS ABAP 7.52 SP01 developer edition: DBACOCKPIT can not login to database
- python - 使用 subprocess.Popen() 后关闭 process.stdout
- javascript - localtunnel 如何在后台工作?
- c# - 文本框将字母转换为数字
- facebook-graph-api - Facebook Graph API:远程服务器返回错误:(400) Bad Request 而不是内部错误
- javascript - 匹配属性的正则表达式
- java - 如何在java中包装一个泛型类
- html - 这种在没有 API 密钥的情况下动态嵌入 Google 地图的特定方法是否适用于 1000 次页面浏览量?
- excel - 在不使用 Excel.Application 的情况下将多个 CSV 合并为一个
- algorithm - 将arraylists1和arraylist2之间相等的自定义对象移除到arraylist1中