是否有可能在Java中捕获内存不足异常? [重复]

问题描述 投票:55回答:9

我正在开发一个需要大量内存的程序,并且我想在内存不足异常发生时捕获。我听说这是不可能的,但对此是否有所发展感到好奇。

java exception out-of-memory
9个回答
87
投票

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

可以在Throwable下降时捕获它:

try {
    // create lots of objects here and stash them somewhere
} catch (OutOfMemoryError E) {
    // release some (all) of the above objects
}

但是,除非您正在做一些相当具体的事情(例如,在特定代码段中分配大量内容),否则您可能将无法捕获它,因为您将不知道它将被扔到哪里。 。


53
投票

可能:

try {
   // tragic logic created OOME, but we can blame it on lack of memory
} catch(OutOfMemoryError e) {
   // but what the hell will you do here :)
} finally {
   // get ready to be fired by your boss
}

26
投票

您可以捕获并尝试从OutOfMemoryError(OOM)异常中进行恢复,但是很可能是一个坏主意 ...尤其是如果您的目标是使应用程序“继续前进”。

原因有很多:

  1. 正如其他人指出的那样,比显式释放事物有更好的方法来管理内存资源;也就是说,对可能在内存不足时释放的对象使用SoftReference和WeakReference。

  2. 如果您等到释放内存后才真正耗尽内存,则您的应用程序可能会花费更多时间来运行垃圾收集器。根据JVM版本和GC调整参数的不同,JVM最终会越来越频繁地运行GC,因为它接近抛出OOM的地步。速度下降(就应用程序执行有用的工作而言)可能非常重要。您可能想避免这种情况。

  3. 如果问题的根本原因是内存泄漏,那么从OOM进行捕获和恢复可能不会回收泄漏的内存。您的应用程序将继续运行一段时间,然后一次又一次,然后一次又一次地以减小的间隔再次运行。

因此,我的建议不是尝试从OOM继续前进... 除非知道

  • OOM发生的地点和原因,
  • 不会有任何“附带损害”,]]
  • 您的恢复将释放足够的内存以继续。

14
投票

只是向所有思考为什么某人可能会用尽内存的人扔掉它:我正在一个经常发生内存不足的项目,我必须为此实施解决方案。


8
投票

可以捕获OutOfMemoryError(它是Error,而不是Exception),但是您应该知道,没有办法获得已定义的行为。尝试捕获它时,您甚至可能收到另一个OutOfMemoryError。


5
投票

当您专门分配可能太大的东西时,可能至少有一个好时机来捕获OutOfMemoryError:


4
投票

可能的,但是如果堆用完了,它不是很有用。如果有可以释放的资源,则最好对这些资源使用SoftReference或WeakReference,并且它们的清除将是自动的。


2
投票

有可能捕获Any


1
投票

当然,允许捕获OutOfMemoryError。确保您有计划以防万一。在分配更多对象之前,您将需要释放一些内存(通过删除对对象的引用),否则您将再次耗尽内存。有时候,仅将堆栈展开几帧就可以为您做到这一点,有时您需要做一些更明确的事情。

© www.soinside.com 2019 - 2024. All rights reserved.