我讀了一些關於Java內存泄漏的內容。它使用陣列實現FIFO隊列以語義泄漏內存。但我不明白爲什麼它會導致內存泄漏。是因爲它沒有使'流行'操作中的未使用的插槽無效?任何人都可以向我解釋?FIFO隊列實現中的Java內存泄漏
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;
}
}
出於好奇,你需要手動實現一個隊列,而不是使用現有的['Queue']之一(http://docs.oracle.com/javase/8/docs/api/java/util/ Queue.html)的實現?例如,['ArrayDeque'](http://docs.oracle.com/javase/8/docs/api/java/util/ArrayDeque.html)聽起來像是你想要在這裏做同樣的事情(除了它是[雙端隊列](http://docs.oracle.com/javase/8/docs/api/java/util/Deque.html)) – Powerlord 2014-10-28 05:42:00
這似乎基本上是在這裏問的同一個問題: http://stackoverflow.com/questions/2843799/why-does-this-code-sample-produce-a-memory-leak?rq=1 但我不明白的是如何ensureCapacity()是正確的在隊列環繞數組末尾(這是常見的情況)的情況下,只需調整大小不會使'queue [head]'可用。 – hcs 2014-10-28 05:59:52