某些類(lèi)內(nèi)部維護(hù)著對(duì)象的過(guò)期引用(指永遠(yuǎn)也不會(huì)再被解除的引用)尉共,這些對(duì)象不會(huì)被當(dāng)作垃圾回收晨逝,產(chǎn)生了內(nèi)存泄露(這類(lèi)內(nèi)存泄露很隱蔽缆娃,稱為“無(wú)意識(shí)的對(duì)象保持”)捷绒,從而對(duì)性能造成潛在的重大影響。
修復(fù)辦法也很簡(jiǎn)單:一旦對(duì)象引用已經(jīng)過(guò)期贯要,只需清空這些引用即可暖侨。“Object = null;”崇渗,清空了過(guò)期引用的另一個(gè)好處時(shí)字逗,如果它們以后又被錯(cuò)誤的解除引用京郑,程序會(huì)拋出NullPointerException異常,而不是悄悄地錯(cuò)誤運(yùn)行下去葫掉。
一般而言些举,只要類(lèi)是自己管理內(nèi)存,程序員就應(yīng)該警惕內(nèi)存泄露問(wèn)題俭厚,一旦元素被釋放掉户魏,則該元素中包含的任何對(duì)象引用都應(yīng)該被清空。
內(nèi)存泄露的另一個(gè)常見(jiàn)來(lái)源是緩存挪挤。一種解決方案是可以用WeakHashMap(使用弱引用)代表緩存叼丑,當(dāng)緩存中的項(xiàng)過(guò)期之后,它們就會(huì)被自動(dòng)刪除扛门。只有當(dāng)所要的緩存項(xiàng)的生命周期是由該Key的外部引用而不是Value決定時(shí)鸠信,WeakHashMap才有用處。
內(nèi)存泄露的第三個(gè)常見(jiàn)來(lái)源是監(jiān)聽(tīng)器和其他回調(diào)论寨。確毙橇ⅲ回調(diào)立即被當(dāng)作垃圾回收的最佳方式是只保存它們的弱引用。