admin管理员组

文章数量:1596328

(Item 5) Eliminate obsolete object references

public class Stack {

    private Object[] elements;

    private int size = 0;

 

    public Stack(int initialCapacity) {

        this.elements = new Object[initialCapacity];

    }

        public void push(Object e) {

        ensureCapacity();

        elements[size++] = e;

    }

 

    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) {

            Object[] oldElements = elements;

            elements = new Object[2 * elements.length + 1];

            System.arraycopy(oldElements, 0, elements, 0, size);

        }

}

 

when the stack grows and shrinks, the object that was pop off will NOT be garbage collected!! Because the stack maintains obsolete references.

The programmer should tell garbage collector that the reference is inactive: null out it

public Object pop() {

    if (size==0)

        throw new EmptyStackException();

    Object result = elements[--size];

    elements[size] = null; // Eliminate obsolete reference

    return result;

}

 

Object references in cache will also not effectively garbage collected! 

本文标签: EliminateItemobsoletereferencesobject