有效的Java說:
內存泄漏的第三個常見原因是監聽器和其他 回調。如果您實現了一個客戶端註冊回調 的API但不明確取消註冊,那麼它們將會累積,除非您的 採取某些措施。確保回調是垃圾 的最好方法是隻存儲對它們的弱引用,對於 實例,只將它們作爲鍵存儲在WeakHashMap中。
我無法理解這一點。有人能解釋這一點嗎?
有效的Java說:
內存泄漏的第三個常見原因是監聽器和其他 回調。如果您實現了一個客戶端註冊回調 的API但不明確取消註冊,那麼它們將會累積,除非您的 採取某些措施。確保回調是垃圾 的最好方法是隻存儲對它們的弱引用,對於 實例,只將它們作爲鍵存儲在WeakHashMap中。
我無法理解這一點。有人能解釋這一點嗎?
對對象持有一個弱引用並不妨礙它被垃圾收集 - 如果沒有更強的對象引用,最終它將被垃圾收集,您將不能再通過WeakReference
訪問它你已經存儲了。谷歌Java weak references tutorial
欲瞭解更多信息。
這意味着:如果對象本身監聽器或回調引用,則引用的對象永遠不會GCed因爲聽衆或回調仍然存在並有從該對象的引用,從而導致內存泄漏。
如果將回調添加到集合但不刪除它們,則會導致內存泄漏。處理這種情況的一種方式(除了確保這些對象總是被正確刪除之外)就是將聽衆存儲在一個弱集合中。當元素/偵聽器不再具有強引用時,弱集合可以刪除條目。
這種方法的問題是你不能擁有這是隻有在集合中引用的監聽器,它會隨機消失(上接GC)
我傾向於使用未提及其他地方聽衆和嘗試以確保未使用的偵聽器被正確刪除。
這個問題在這裏回答。 http://stackoverflow.com/questions/2859464/how-to-avoid-memory-leaks-in-callback –