try-catch能捕获Out Of Memory Error吗?

简介: 现已知代码A可能诱发OOM。代码B可替代代码A但可维护性差。我希望能先尝试执行代码A,如果发生OOM,则退回来执行代码B。那么如下代码可行吗?

现已知代码A可能诱发OOM。代码B可替代代码A但可维护性差。我希望能先尝试执行代码A,如果发生OOM,则退回来执行代码B。

那么如下代码可行吗?

try {
  代码A
} catch (OutOfMemoryError ignored) {
  代码B
}

试验了一下似乎可行。但一般认为OOM发生在系统层级,上述代码无法获得期望效果。

只有在一种情况下,这样做是可行:在try语句中声明了很大的对象,导致OOM,并且可以确认OOM是由try语句中的对象声明导致的,则在catch语句中,可以释放掉这些对象,解决OOM,继续执行剩余语句。但这通常不是合适做法。

因为OOMError是可以catch的。catch之后吞掉的话程序还能试着继续运行。比如一个Java服务器端应用,有段代码没写对导致有一个线程在疯狂创建大数组对象——直到OOM。这个线程注册的uncaught exception handler捕获到了这个异常,记录了日志,然后就把这个异常吞掉了。这样还能继续正常跑下去是因为:只是一个创建很大的数组对象的请求失败了而已,而出错的那个方法由于异常处理已经被退出了,程序的其它部分并没有受影响。

Java中管理内存除了显式catch OOM外还有更多有效的方法:比如SoftReference, WeakReference, 硬盘缓存等。在JVM用光内存之前,会多次触发GC,这些GC会降低程序运行效率。如果OOM的原因不是try语句中的对象(比如内存泄漏),那么在catch语句中会继续抛出OOM!


参考

目录
相关文章
|
8天前
|
Java 程序员
Java异常处理:Error和Exception有什么区别?
Java异常处理:Error和Exception有什么区别?
225 0
|
11月前
|
JavaScript 前端开发 开发者
Error,Error,到底什么是Error
总所周知,当系统运行出现错误的时候,就会抛出一个 Error ,那么这个 Error 是什么?它是怎么来的?它又是怎么被抛出的?它又是怎么被捕获的?这些问题,我们一起来探讨一下。
129 0
|
11月前
|
Java
Exception 和 Error 有什么区别?
Java 平台对不同的异常进行了分类,具体被分为了 Exception 和 Error,他们都是继承了 Throwable 类。
69 0
Exception 和 Error 有什么区别?
|
11月前
|
存储 前端开发 Java
Exception 和 Error
Exception 和 Error
66 0
|
Android开发
RuntimeException: setAudioSource failed异常
RuntimeException: setAudioSource failed异常
167 0
|
安全 Java 程序员
Exception和Error的区别
Exception和Error的
141 0
|
安全
Error、Exception区别
Error、Exception区别
|
安全 Java 数据库连接
Exception和Error有什么区别吗
Exception和Error有什么区别吗
194 1
Exception和Error 有什么区别
Exception和Error 有什么区别
120 0
Exception和Error 有什么区别

热门文章

最新文章