为了账号安全,请及时绑定邮箱和手机立即绑定

是否有可能在java中捕获内存不足?

是否有可能在java中捕获内存不足?

慕田峪9158850 2019-09-02 16:01:31
我正在开发一个需要大量内存的程序,我想在发生内存不足异常时捕获。我听说这是不可能做到的,但是如果在这方面有任何发展,我很好奇。
查看完整描述

3 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

这不是例外; 这是一个错误:java.lang.OutOfMemoryError


从Throwable下降时你可以捕获它:


try {

    // create lots of objects here and stash them somewhere

} catch (OutOfMemoryError E) {

    // release some (all) of the above objects

}

但是,除非你正在做一些相当具体的事情(比如在特定的代码段中分配大量的东西),否则你可能无法捕获它,因为你不知道它会从哪里被抛出。


查看完整回答
反对 回复 2019-09-02
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

您可以捕获并尝试从OutOfMemoryError(OOM)异常中恢复,但这可能是一个糟糕的想法 ...特别是如果您的目标是让应用程序“继续”。

有许多的原因:

  1. 正如其他人所指出的那样,有更好的方法来管理内存资源而不是明确地释放内容; 即对内存较短时可以释放的对象使用SoftReference和WeakReference。

  2. 如果你等到实际耗尽内存之前你的应用程序,你的应用程序可能会花更多的时间来运行垃圾收集器。根据您的JVM版本和GC调整参数,JVM可能会越来越频繁地运行GC,因为它接近抛出OOM的点。减速(就应用程序做有用的工作而言)可能很重要。你可能想避免这种情况。

  3. 如果您的问题的根本原因是内存泄漏,那么从OOM捕获和恢复的可能性将无法回收泄漏的内存。您的应用程序将再次持续一段时间,然后再次,并再次以不断减少的间隔。

所以我的建议是不要试图继续从OOM出发...除非你知道

  • OOM发生的地点和原因,

  • 没有任何“附带损害”,并且

  • 您的恢复将释放足够的内存以继续。


查看完整回答
反对 回复 2019-09-02
  • 3 回答
  • 0 关注
  • 495 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信