消除过期的对象引用
一个栈实践的反例
本例中凡是被弹出的对象都是过期的引用
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