消除過期的對(duì)象引用

某些類內(nèi)部維護(hù)著對(duì)象的過期引用(指永遠(yuǎn)也不會(huì)再被解除的引用),這些對(duì)象不會(huì)被當(dāng)作垃圾回收,產(chǎn)生了內(nèi)存泄露(這類內(nèi)存泄露很隱蔽,稱為“無意識(shí)的對(duì)象保持”),從而對(duì)性能造成潛在的重大影響。
修復(fù)辦法也很簡(jiǎn)單:一旦對(duì)象引用已經(jīng)過期,只需清空這些引用即可?!癘bject = null;”,清空了過期引用的另一個(gè)好處時(shí),如果它們以后又被錯(cuò)誤的解除引用,程序會(huì)拋出NullPointerException異常,而不是悄悄地錯(cuò)誤運(yùn)行下去。
一般而言,只要類是自己管理內(nèi)存,程序員就應(yīng)該警惕內(nèi)存泄露問題,一旦元素被釋放掉,則該元素中包含的任何對(duì)象引用都應(yīng)該被清空。

內(nèi)存泄露的另一個(gè)常見來源是緩存。一種解決方案是可以用WeakHashMap(使用弱引用)代表緩存,當(dāng)緩存中的項(xiàng)過期之后,它們就會(huì)被自動(dòng)刪除。只有當(dāng)所要的緩存項(xiàng)的生命周期是由該Key的外部引用而不是Value決定時(shí),WeakHashMap才有用處。

內(nèi)存泄露的第三個(gè)常見來源是監(jiān)聽器和其他回調(diào)。確保回調(diào)立即被當(dāng)作垃圾回收的最佳方式是只保存它們的弱引用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 如圖所示的例子,這段程序中沒有明顯的錯(cuò)誤,但是存在一個(gè)隱藏的問題(“內(nèi)存泄漏”),隨著垃圾回收活動(dòng)的增加,或者由于...
    郭_4d5f閱讀 513評(píng)論 0 0
  • 問題的引出 這段程序有一個(gè)“內(nèi)存泄露”,隨著GC活動(dòng)的增加,或者由于內(nèi)存占用的不斷增加,程序性能降低會(huì)逐漸表現(xiàn)出來...
    每天學(xué)點(diǎn)編程閱讀 575評(píng)論 0 4
  • 什么是過期的對(duì)象引用? 我們通過簡(jiǎn)單的棧實(shí)現(xiàn)來引入過期的對(duì)象引用。 實(shí)際上,這段程序中并沒有很明顯的錯(cuò)誤。無論如何...
    大海孤了島閱讀 1,041評(píng)論 1 2
  • 很多人可能在想這么一個(gè)問題:Java有垃圾回收機(jī)制,那么還存在內(nèi)存泄露嗎?答案是肯定的,所謂的垃圾回收GC會(huì)自動(dòng)管...
    Ruheng閱讀 1,737評(píng)論 0 5
  • 你能看出以下代碼哪里內(nèi)存泄漏嗎? 答案是: pop()方法存在內(nèi)存泄漏。 內(nèi)存泄漏可以稱為“ 無意識(shí)的對(duì)象保持(u...
    DeppWang閱讀 271評(píng)論 0 2

友情鏈接更多精彩內(nèi)容