垃圾回收器是根據對象被引用數來決定是否回收的,也就是說沒一個對象在內存中都會有一個計數器,保存該對象當前被引用的次數,如果被引用的次數爲0 的時候,垃圾回收器就會選擇一個適當的實際將該對象所佔的內存空間回收,並將該對象釋放,問題就出在這個計數器上,如果該計數器不爲0,也就是說對象仍然會被一次或者多次引用,而我們並沒有意識到這一點,那麼這個引用計數器就永遠不會是0了,就會造成這個對象永遠不會被釋放,從而造成內存泄漏的情況,例子:
public class stack{
private Person [] persons;
private int currentIndex ;
public Person pop(){
if(currentIndex == 0)
new ThrowException ();
currentIndex -- ;
return persons[currentIndex];
}
}
當pop方法直接從persons數組中取出某個位置的Person對象並返回後,person數組中的相應Person對象沒有被釋放,而且在同樣的位置在雅茹新的Person對象的時候,原來的對象就再也沒有被釋放的機會了,這樣Person對象的引用次數至少爲1,而且永遠爲1(Stack 對象被釋放) ,爲了避免這樣的情況的發生,不要直接返回persons數組的Person對象,而要先將Person對象取出,再將persons數組中的相應位置設爲null (引用指針減一)
public Person pop(){
if(currentIndex == 0)
throw new Exception;
Person person = persons[currenIndex];
//引用計數減一
persons[currenIndex] == null
return person;
}
}