3 回答

TA貢獻1796條經(jīng)驗 獲得超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條經(jīng)驗 獲得超9個贊
您可以捕獲并嘗試從OutOfMemoryError(OOM)異常中恢復,但這可能是一個糟糕的想法 ...特別是如果您的目標是讓應用程序“繼續(xù)”。
有許多的原因:
正如其他人所指出的那樣,有更好的方法來管理內(nèi)存資源而不是明確地釋放內(nèi)容; 即對內(nèi)存較短時可以釋放的對象使用SoftReference和WeakReference。
如果你等到實際耗盡內(nèi)存之前你的應用程序,你的應用程序可能會花更多的時間來運行垃圾收集器。根據(jù)您的JVM版本和GC調(diào)整參數(shù),JVM可能會越來越頻繁地運行GC,因為它接近拋出OOM的點。減速(就應用程序做有用的工作而言)可能很重要。你可能想避免這種情況。
如果您的問題的根本原因是內(nèi)存泄漏,那么從OOM捕獲和恢復的可能性將無法回收泄漏的內(nèi)存。您的應用程序?qū)⒃俅纬掷m(xù)一段時間,然后再次,并再次以不斷減少的間隔。
所以我的建議是不要試圖繼續(xù)從OOM出發(fā)...除非你知道:
OOM發(fā)生的地點和原因,
沒有任何“附帶損害”,并且
您的恢復將釋放足夠的內(nèi)存以繼續(xù)。
添加回答
舉報