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

JAVA内存泄漏

2011-07-13 08:08 197 查看

错误严重度

如果内存泄漏面积过大,将会导致B类或A类故障

错误案例

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;
}
……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: