joh*_*ohn 3 java out-of-memory
一般的建议是你不应该捕获java.lang.Error,除非在特殊情况下,请参阅捕获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);
}
}
Run Code Online (Sandbox Code Playgroud)
另一个程序是类似的,除了它可能是消耗所有内存的一个特定线程.在这种情况下,如果该线程退出,则可以继续处理,我真正想要的只是查看日志并最终具有非零退出代码.那么我应该在那个线程运行方法中捕获OutOfMemoryError吗?
在调用堆栈的最顶端有一个异常屏障,捕获并记录所有Throwable
s ,这是完全合理的.在服务器端代码中,这实际上是常态.如果你确保OutOfMemoryError
只捕获那个级别,而不是低级,那么它很有可能不会损害你的系统:当调用堆栈展开时,为请求提供服务而创建的所有对象都将无法访问.由于OOME很可能恰好出现在系统上造成最强记忆压力的线程中,因此所有记忆都将被回收,系统的其余部分将能够再次呼吸.
是的,从技术上讲,总有机会让OOME进入一个finally
区块,导致资源泄漏或更糟; 或者在一些修改了长寿命的全局结构的代码中,打破了它的不变量,但在实践中它是不太可能的.
在决定您对OOME的政策时,请记住,您的应用程序受到许多不可预测因素的影响,这些因素或多或少会降低其稳定性.OOME只是该频谱中的另一个点,通常其风险影响不是特别高.
归档时间: |
|
查看次数: |
2211 次 |
最近记录: |