`
shawnccx
  • 浏览: 165676 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

java内存泄漏

阅读更多
错误案例
public class Stack
{
    private Object[] elements;
    private int size = 0;

    public Stack(int i)
    {
        this.elements = new Object[i];
    }

    public void push(Object e)
    {
        ensure();
        elements[size++] = e;
    }

    public Object pop()
    {
        if(size == 0)
        {
            ////
        }
 
        return elements[size--];
    }

    private void ensure()
    {
        ////
    }
}
错误分析
一般来说,Java的垃圾回收机制解决了大部分的内存泄漏问题,但这并不等于Java中的不存在内存泄漏。

Java中的内存泄漏主要是指对象被不合理的长期持有。

例如,上述用法中,标红的地方存在着内存泄漏的问题,因为当它被弹出堆栈(size--)的时候,elements[size]对象已无法通过正常的途径来访问;但同时,它也没有成为可回收的垃圾对象,因为Stack维护着他们的绝对的引用。假设在stack中放入大量对象,之后又通过pop()方法逐一弹出,此时stack对象仍占据大量垃圾对象,直到整个Stack被销毁。

因此,在内存消耗过大的时候,可以检查在用JAVA集合类(特别是hashmap)的时候,是否有大量对象被不合理的长期持有。




正确用法
……
public Object pop()
{
    if(size == 0)
    {
        ////
    }
    Object obj = elements[--size];
    elements[size] = null;
 
    return obj;
}
……
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics