2、Java的内存泄漏
什么是内存泄漏呢?程序运行过程中会不断分配内存空间,那些不再使用的内存空间应该即时被回收,从而保证系统可以再次使用这些内存空间,如果存在无用的内存没有被回收回来,那就是内存泄漏。
对于Java程序来说,所有不可达的对象都由垃圾回收机制负责回收,因此程序员不需要考虑这部分的内存泄漏。但如果程序中有一些Java对象,它们处于可达状态,但程序以后永远都不会再访问它们,那么它们所占用的空间也不会被回收,它们所占用的空间也会产生内存泄漏。
//ArrayList中remove(int index)方法源代码
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; // clear to let GC do its work ①
return oldValue;
}
上面①行代码就是为了避免垃圾回收机制而书写的代码。如果没有这行代码,这个方法就会产生内存泄漏,原因:删除一个对象,但该对象所占用的内存空间不会释放。
例如,试图删除ArrayList最后一个元素,假设该ArrayList底层的数组长度为8,里面装有4个元素,此时内存中的分配示意图如下所示。