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

举报
JavaEdge 发表于 2021/08/06 01:23:18 2021/08/06
【摘要】 现已知代码A可能诱发OOM。代码B可替代代码A但可维护性差。我希望能先尝试执行代码A,如果发生OOM,则退回来执行代码B。 那么如下代码可行吗? try { 代码A } catch (OutOfMemoryError ignored) { 代码B } 12345 试验了一下似乎可行。但一般认为OOM发生在系统层级,上述代码无法获得期望效果。 只有在一种情况下,...

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

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

试验了一下似乎可行。但一般认为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!

参考

  • https://www.zhihu.com/question/54630917/answer/140320945
  • https://www.zhihu.com/question/33194730

文章来源: javaedge.blog.csdn.net,作者:JavaEdge.,版权归原作者所有,如需转载,请联系作者。

原文链接:javaedge.blog.csdn.net/article/details/119413723

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。