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; } ……