解读:如果一个对象的引用没有断开(实际这个对象已经没有用了),这个对象占用的堆空间就不会释放掉,造成不必要的内存泄漏
1、如果一个类是自己管理内存的,则要警惕内存泄漏。
因为既然是自己管理内存,那么对于内存的释放当然也要自己注意。看下面的一个类。
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;
}
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);
}
}
对于pop方法,一个单元弹出栈后,指向这个单元的引用就过期了,需要清空该引用。改进的方法非常简单,对于该引用指向null即可。
public Object pop() {
if (size == 0)
throw new EmptyStackException();
Object result = elements[--size];
elements[size] = null;
return result;
}
当然关于清空对象的引用不用改过分地太注意,正如文中说的:清空对象引用只是一种例外,不是一种规范行为。
2、内存泄漏的另一个常见来源是缓存。
这一点的理解比较模糊,后面再补充,这点提到了强引用,弱引用,以及WeakHashMap,以及java.lang.ref包,都是知识盲点,后面补充。
3、内存泄漏的第三个常见来源是监听器和其他回调。
这一点文中简单提了,没搞明白,后面慢慢理解补充。