某些類內(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)作垃圾回收的最佳方式是只保存它們的弱引用。