今天在读java的ArrayList 的源码的时候对该方法里面的动作
public E remove(int index) {
RangeCheck(index);
modCount++;
E oldValue = elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work
return oldValue;
}
elementData[--size] = null; // Let gc do its work 百思不得其解,不明白为什么要做这样一个动作,有什么意义。无意见拿起手边的effective java这本书 ,原来这句代码是消除过期的对象的引用!!防止发生outofmemoryerror ,把这章看完,感觉仍然很模糊,为什么垃圾回收器不回收这些引用?什么时候一个类自己管理自己的内存?或者什么叫做一个类自己管理自己的内存?看书上的解释,似乎有数组的情况下,有可能发生这样的事情,那么有没有其他的存在情况呢?
还有就是作者所说的缓存也有可能存在这种情况,也很是茫然。
java中所谓管理自己的内存,就是在对象中维护一些引用,即使外界暂时不再使用这些引用,GC也不会释放他们(因为还在被管理对象引用着)。当外界完全不再使用某引用时,管理对象应该及时的清除这个引用,否则就会造成内存泄露。
形象点说,你可以把引用当作钩子,管理对象当作架子,被管理的对象当作鸭子,GC就是在地上跑来跑去拣掉下来鸭子的狗。
鸭子通过钩子挂在架子上,我们需要的时候随时都能从架子上找到所需要的鸭子,即便我们暂时不用,鸭子也不会被狗叼走。可是如果一只鸭子臭了,我们以后永远用不着了,那么我们就会断开钩子,鸭子就会掉在地上被狗拣跑了。
也就是说,只要你自己管理了一个对象的引用,GC就不会帮你去释放,只有释放了引用,GC才会释放引用指向的对象。