3 回答
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
}
但是,除非你正在做一些相当具体的事情(比如在特定的代码段中分配大量的东西),否则你可能无法捕获它,因为你不知道它会从哪里被抛出。
TA贡献1831条经验 获得超9个赞
您可以捕获并尝试从OutOfMemoryError(OOM)异常中恢复,但这可能是一个糟糕的想法 ...特别是如果您的目标是让应用程序“继续”。
有许多的原因:
正如其他人所指出的那样,有更好的方法来管理内存资源而不是明确地释放内容; 即对内存较短时可以释放的对象使用SoftReference和WeakReference。
如果你等到实际耗尽内存之前你的应用程序,你的应用程序可能会花更多的时间来运行垃圾收集器。根据您的JVM版本和GC调整参数,JVM可能会越来越频繁地运行GC,因为它接近抛出OOM的点。减速(就应用程序做有用的工作而言)可能很重要。你可能想避免这种情况。
如果您的问题的根本原因是内存泄漏,那么从OOM捕获和恢复的可能性将无法回收泄漏的内存。您的应用程序将再次持续一段时间,然后再次,并再次以不断减少的间隔。
所以我的建议是不要试图继续从OOM出发...除非你知道:
OOM发生的地点和原因,
没有任何“附带损害”,并且
您的恢复将释放足够的内存以继续。
添加回答
举报