第6条:消除过期的对象引用
入栈再弹栈,弹出的对象 即使没有被引用,也不会被回收,因为栈内部会维护这些对象的过期引用(obsolete reference)。
什么是过期引用呢?过期引用是指永远也不会被解除的引用,所有栈内活动部分之外的引用都是过期的,即被弹出后就是过期的。
内存泄露的第一种来源: 无意识对象保持。
在这里样例用手动清空的方式解决此问题,所以要进行有意识的清除此类对象。清空对象引用实则是一种例外,而不是常规使用,只有特殊情况下才使用。
优选让包含该引用的变量结束其生命周期。所以只要类是自己管理内存,程序员就应该警惕内存泄漏问题。一旦元素被释放掉,该元素中包含的任何对象引用都应该被清空。
/**
* 消除过期的对象引用
*/
public class Stack {
private Object[] elements;//如果该成员是final类型 则clone时会报错
private int size = 0;
private static final int DEFAULT_INITIAL = 16;
public Stack(){
elements = new Object[DEFAULT_INITIAL];
}
public void push(Object e) {
ensureCapacity();
elements[size++] = e;
}
//弹栈的时候 出来的对象 及时没有被引用 也不会被垃圾回收 ,因为 栈内部会对这
些对象维护的过期引用存在内存泄露问题。
//2 处理方法 清空被弹出的对象
// 但是 方法依然不是最好的处理方法,最好的方法是调用该引用的