您的位置:首页 > 编程语言 > Java开发

Java内存泄露例子

2015-08-19 15:56 561 查看
直接上例子:

如果自己实现了一个栈,
pop
方法实现如下:

[code]public Object pop(){   
    if(size==0) 
        throw new EmptyStackException();   
    return element[--size]; //短暂造成内存泄露   
    }


那么当前size对象虽然已经弹出了,但是
element
仍然持有这个对象的引用,必须要等到
push
操作覆盖这个引用
GC
才可以工作。

再看看Java中的栈是怎么实现的

Stack.java

[code]    public synchronized E pop() {
        E       obj;
        int     len = size();

        obj = peek();
        removeElementAt(len - 1);

        return obj;
    }


由于Java的
Stack
直接继承了
Vector
直接调用了
Vector
removeElementAt
方法,看下这个方法:

[code]    public synchronized void removeElementAt(int index) {
        modCount++;
        if (index >= elementCount) {
            throw new ArrayIndexOutOfBoundsException(index + " >= " +
                                                     elementCount);
        }
        else if (index < 0) {
            throw new ArrayIndexOutOfBoundsException(index);
        }
        int j = elementCount - index - 1;
        if (j > 0) {
            System.arraycopy(elementData, index + 1, elementData, index, j);
        }
        elementCount--;
        elementData[elementCount] = null; /* to let gc do its work */
    }


看到最后一句显式设为null,注释都写好了,to let gc do its work。-,-

另外在《Practical Java》中把“不使用的对象应手动赋为null”作为一条推荐的编码规则,在周志明的《深入理解Java虚拟机》的Chapter8中也有说明。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: