6、消除過期的物件引用

guanhang89發表於2016-06-08

消除過期的物件引用

一個棧實踐的反例

本例中凡是被彈出的物件都是過期的引用

public class Stack {
    private Object[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;

    public Stack() {
        elements = new Object[DEFAULT_INITIAL_CAPACITY];
    }

    public void push(Object e) {
        ensureCapacity();
        elements[size++] = e;
    }
    //彈出的物件不會被回收,所有要手動置為null
    //elements[size] = null;
    public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
        return elements[--size];
    }

    /**
     * Ensure space for at least one more element, roughly doubling the capacity
     * each time the array needs to grow.
     */
    private void ensureCapacity() {
        if (elements.length == size)
            elements = Arrays.copyOf(elements, 2 * size + 1);
    }
}

一般而言只要是類自己管理記憶體(比如上面的物件陣列),程式設計師就應該警惕記憶體洩漏問題

另一個記憶體洩漏的常見來源是快取

使用WeakHashMap

第三個來源是監聽器和其他回撥

相關文章