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

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;//消除引用,结束变量的生命周期