try-catch能捕獲Out Of Memory Error嗎?
現(xiàn)已知代碼A可能誘發(fā)OOM。代碼B可替代代碼A但可維護(hù)性差。我希望能先嘗試執(zhí)行代碼A,如果發(fā)生OOM,則退回來執(zhí)行代碼B。

那么如下代碼可行嗎?
try { 代碼A } catch (OutOfMemoryError ignored) { 代碼B }
1
2
3
4
5
試驗了一下似乎可行。但一般認(rèn)為OOM發(fā)生在系統(tǒng)層級,上述代碼無法獲得期望效果。
只有在一種情況下,這樣做是可行:在try語句中聲明了很大的對象,導(dǎo)致OOM,并且可以確認(rèn)OOM是由try語句中的對象聲明導(dǎo)致的,則在catch語句中,可以釋放掉這些對象,解決OOM,繼續(xù)執(zhí)行剩余語句。但這通常不是合適做法。
因為OOMError是可以catch的。catch之后吞掉的話程序還能試著繼續(xù)運行。比如一個Java服務(wù)器端應(yīng)用,有段代碼沒寫對導(dǎo)致有一個線程在瘋狂創(chuàng)建大數(shù)組對象——直到OOM。這個線程注冊的uncaught exception handler捕獲到了這個異常,記錄了日志,然后就把這個異常吞掉了。這樣還能繼續(xù)正常跑下去是因為:只是一個創(chuàng)建很大的數(shù)組對象的請求失敗了而已,而出錯的那個方法由于異常處理已經(jīng)被退出了,程序的其它部分并沒有受影響。
Java中管理內(nèi)存除了顯式catch OOM外還有更多有效的方法:比如SoftReference, WeakReference, 硬盤緩存等。在JVM用光內(nèi)存之前,會多次觸發(fā)GC,這些GC會降低程序運行效率。如果OOM的原因不是try語句中的對象(比如內(nèi)存泄漏),那么在catch語句中會繼續(xù)拋出OOM!
參考
https://www.zhihu.com/question/54630917/answer/140320945
https://www.zhihu.com/question/33194730
Java
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。