FIFO队列实现中的Java内存泄漏

时间:2014-10-28 05:13:06

标签: java memory-leaks

我读了一些关于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;
        }
    }

1 个答案:

答案 0 :(得分:0)

你回答了自己的问题:)

由于您不清理队列引用垃圾收集器,因此您无法在内存中清除它,因为您在FIFOQueue中有对此Object的有效引用。这样就会使用未使用的对象污染内存,从而减少程序可用的内存。

同样如注释中所指出的,你的ensureCapasity函数只有在尾部位于数组的末尾才能工作,否则你在推送时会丢失队列中的元素,这比排队[head]更重要]参考问题。