我读了一些关于Java内存泄漏的资料。它使用数组实现FIFO队列以在语义上泄漏内存。但我不明白为什么它会导致内存泄漏。是因为它没有取消'pop'操作中未使用的插槽吗?有人可以向我解释一下吗?
queue[head] = null
FIFO队列实现如下:
public class FIFOQueue {
private Object[] queue;
private int size = 0, head = 0, tail = 0;
private static final int INITIAL_CAPACITY = 16;
public FIFOQueue() {
queue = new Object[INITIAL_CAPACITY];
}
public void push(Object e) {
ensureCapacity();
queue[tail] = e;
size++;
tail = increment(tail);
}
public Object pop() throws EmptyStackException {
if (size == 0)
throw new EmptyStackException();
size–;
Object returnValue = queue[head];
head = increment(head);
return returnValue;
}
/** doubling the capacity each time the array needs to grow. */
private void ensureCapacity() {
if (queue.length == size)
queue = Arrays.copyOf(queue, 2 * size + 1);
}
/** make sure the pointers are wrapped around at the end of the array */
private int increment( int x ) {
if( ++x == queue.length )
x = 0;
return x;
}
}
答案 0 :(得分:0)
你回答了自己的问题:)
由于您不清理队列引用垃圾收集器,因此您无法在内存中清除它,因为您在FIFOQueue中有对此Object的有效引用。这样就会使用未使用的对象污染内存,从而减少程序可用的内存。
同样如注释中所指出的,你的ensureCapasity函数只有在尾部位于数组的末尾才能工作,否则你在推送时会丢失队列中的元素,这比排队[head]更重要]参考问题。