6.消除過(guò)期的對(duì)象引用

內(nèi)存泄露常見來(lái)源:

一、過(guò)期引用

元素出棧,忘記設(shè)置為Null:

如果一個(gè)棧先是增長(zhǎng),然后再收縮,從棧中彈出來(lái)的對(duì)象不會(huì)被當(dāng)作垃圾回收,即使使用棧的程序不再引用這些對(duì)象,它們也不會(huì)被回收。因?yàn)闂?nèi)部維護(hù)著對(duì)這些對(duì)象的過(guò)期引用(obsolete reference)。指永遠(yuǎn)也不會(huì)再被解除的引用。

在本例中,在elements數(shù)組的“活動(dòng)部分(active portion)”之外的任何引用都是過(guò)期的。活動(dòng)部分指elements中下標(biāo)小于size的那些元素。

解決方法清空引用。元素被彈出棧,指向它的引用就過(guò)期了。修改如下:

清空好處:如果它們以后又被錯(cuò)誤地解除引用,程序拋出NullPointerException異常

最好的方法:讓包含該引用的變量結(jié)束其生命周期。如果在最緊湊的作用域范圍內(nèi)定義每一個(gè)變量(見第45條),這種情形會(huì)自然而然地發(fā)生。

只要類是自己管理內(nèi)存,程序員就應(yīng)該警惕內(nèi)存泄漏問(wèn)題。一旦元素被釋放掉,該元素中包含的任何對(duì)象引用都應(yīng)該被清空。

二、緩存。

只要在緩存之外存在對(duì)某個(gè)項(xiàng)的鍵的引用(外部代碼沒(méi)有持有m中的一個(gè)鍵的引用),該項(xiàng)就有意義;如果沒(méi)有,可以使用WeakHashMap來(lái)代表緩存。過(guò)期則清空

三、監(jiān)聽器和其他回調(diào)。

AppCompatActivity實(shí)現(xiàn)一個(gè)接口OnNetworkChangedListener,用來(lái)監(jiān)聽網(wǎng)絡(luò)的變化。然后,把這個(gè)監(jiān)聽器注冊(cè)NetworkManager實(shí)例中。

NetworkManager實(shí)例持有監(jiān)聽器(MainActivity是實(shí)現(xiàn)者,指向MainActivity對(duì)象的引用)。

當(dāng)NetworkManger實(shí)例的生命周期比MainActivity長(zhǎng),當(dāng)MainActivity銷毀時(shí)(比如屏幕發(fā)生旋轉(zhuǎn)),NetworkManager實(shí)例還沒(méi)有銷毀,它持有指向MainActivity對(duì)象的引用。系統(tǒng)回調(diào)MainActivity的onDestroy方法,這時(shí),GC是要回收MainActivity對(duì)象的,但是,MainActivity對(duì)象依然可達(dá)(NetworkManager實(shí)例持有指向MainActivity對(duì)象的引用),所以沒(méi)有回收,MainActivity對(duì)象泄露

解決辦法:

https://www.cnblogs.com/WJQ2017/p/7634330.html

https://www.cnblogs.com/ttylinux/archive/2017/03/12/6536929.html

?著作權(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)容

  • 我們用java管理內(nèi)存是十分容易的,因?yàn)閖vm會(huì)幫我管理內(nèi)存的釋放,但是這不意味著我們不用擔(dān)心內(nèi)存的事情了 造成內(nèi)...
    哲學(xué)與豆包閱讀 275評(píng)論 0 0
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,262評(píng)論 8 265
  • 如圖所示的例子,這段程序中沒(méi)有明顯的錯(cuò)誤,但是存在一個(gè)隱藏的問(wèn)題(“內(nèi)存泄漏”),隨著垃圾回收活動(dòng)的增加,或者由于...
    郭_4d5f閱讀 512評(píng)論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,674評(píng)論 1 32
  • 摘要:今天開始,我們就需要?jiǎng)邮謱?shí)踐了,邊看文章,邊手動(dòng)操作。你需要準(zhǔn)備一個(gè)“數(shù)字萬(wàn)用表”、一塊“臺(tái)式電腦的主板”。...
    最愛白菜閱讀 361評(píng)論 0 1

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