对象的引用过期问题

先要明白一个概念是在你使用完某个对象之后,对象处于未被引用的状态,此时就会被回收。

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

public Stack(){
elements=new Object[DEFALUT_INITIAL_CAPACITY];
}
public void push(Object o){
ensureCapacity();//检查容量
elements[size++]=e;

}
public Object pop(){
   if(size==0){
     throw new EmptyStackException();
     return elements[size--];
     }
}

private void ensureCapacity(){
    if(elements.length==size){
         elements=Arrays.copyOf(elements,2*size+1);
        }

}

}

在上述代码中如果栈如果是先扩大,然后再缩小的情况下,会造成从栈中弹出的对象将不会被垃圾回收,即使你不在引用这些对象。它们不会被回收的 原因是因为栈内部维护着对这些对象的过期引用。此时的对象永远不会被接触引用,如果有大量的过期引用对象,将会对系统造成过大的不必要的负担。
解决的办法如下:在pop方法中
Object result=elements[--size];
elements[size]=null;//消除引用,结束变量的生命周期

猜你喜欢

转载自blog.51cto.com/13919712/2284388