讀書筆記-《Effective Java》第6條:消除過期的物件引用
阿新 • • 發佈:2018-12-29
記憶體洩漏的三種可能
1. 類自己管理記憶體,一旦元素被釋放掉,則該元素中包含的任何物件引用都應該被清空。
例如:ArrayList類的remove方法。 elementData[--size] = null; // clear to let GC do its work
/** * Removes the element at the specified position in this list. * Shifts any subsequent elements to the left (subtracts one from their * indices). * * @param index the index of the element to be removed * @return the element that was removed from the list * @throws IndexOutOfBoundsException {@inheritDoc} */ public E remove(int index) { rangeCheck(index); modCount++; E oldValue = elementData(index); int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // clear to let GC do its work return oldValue; }
2. 來自快取
用框架裡面的快取就大概不會有問題吧,都有各種清除策略,專門研究快取的時候再細看。
3. 監聽器和其他回撥(看不懂,先抄下來)
原文:如果你實現了一個API,客戶端在這個API中註冊回撥,卻沒有顯式的地取消註冊,那麼除非你採取某些動作,否則它們就會聚積。確保回撥立即被當做垃圾回收的最佳方法是隻儲存它們的弱引用(weak reference),例如,只將它們儲存成WeakHashMap中的鍵。