垃圾回收器是根据对象被引用数来决定是否回收的,也就是说没一个对象在内存中都会有一个计数器,保存该对象当前被引用的次数,如果被引用的次数为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;
}
}