错误案例
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;
}
……
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;
}
……