【发布时间】:2012-12-31 20:45:20
【问题描述】:
一般的建议是你不应该捕获 java.lang.Error 除非在特殊情况下,例如见Is it a bad practice to catch Throwable?。
我的情况是我有一个程序有时会耗尽内存并抛出 java.lang.OutOfMemoryError。尽管无法从中恢复,但我确实想知道它发生了,所以我希望在日志中看到一些东西和一个非零退出代码。那么这样的做法值得推荐吗?
public static void main(String[] args)
{
try
{
...
}
catch (Exception e)
{
e.printStackTrace();
System.exit(1);
}
catch (OutOfMemoryError e)
{
e.printStackTrace();
System.exit(1);
}
}
另一个程序与此类似,只是它可能是一个消耗所有内存的特定线程。在这种情况下,如果该线程退出,则可以继续处理,我真正想要的只是查看日志并最终获得非零退出代码。那么我应该在那个线程运行方法中捕获 OutOfMemoryError 吗?
【问题讨论】:
-
如果你抓住了它,你会怎么做?如果你的内存用完了,那么你认为你能记录什么?有什么意义?
-
在您的代码示例中,printStackTrace 创建了一些对象,并可能引发另一个 OOME,因此不完整,但除此之外,它不会真正造成比您拥有的更多的伤害。
-
捕获异常并执行其他操作甚至会导致抛出其他 OutOfMemoryError!
-
关键是要知道它发生了,以便在必要时可以使用更多内存重新运行生产作业,或者删除导致问题的大记录。
-
@SJuan76 显式的
System.gc()完全是多余的。如果有垃圾需要处理,任何理智的 GC 都不会抛出 OOME。
标签: java out-of-memory