1. 程式人生 > >讀書筆記-《Effective Java》第6條:消除過期的物件引用

讀書筆記-《Effective Java》第6條:消除過期的物件引用

記憶體洩漏的三種可能

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中的鍵。