對象的引用過期問題

先要明白一個概念是在你使用完某個對象之後,對象處於未被引用的狀態,此時就會被回收。

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;//消除引用,結束變量的生命週期

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章