经典的JAVA内存泄露代码征集
http://www.javaeye.com/topic/306515
有没有人总结过一些经典的常见的导致内存泄露的代码。
如果能将一些比较常见的导致内存泄露的代码整理出来的话,无论对于新手还是在项目组中进行代码检查都是能够省一些力气的吧。
我先整理两个:
反模式1:未正确的关闭数据库连接
public void foo() {
Connection conn = getConnection();
Statement stmt = null;
try {
conn = getConnection();
stmt = conn.createStatement();
} catch (Exception e) {
} finally {
close(stmt, conn);
}
}
在上述案例中的第1行代码中,作者已经申请了一个Connection,但在第2行代码中,又申请了一个新的Connection,并且丢失了第 一次申请的connection的引用,至此,当程序每调一次foo方法,将导致申请一个新的Connection而没有释放它,如此一来,当数据库达到 能够承受的最大连接数时,将导致整个应用的运行失败。
反模式2:
public class Stack {
private Object[] elements;
private int size = 0;
public Stack(int initialCapacity) {
this.elements = new Object[initialCapacity];
}
public void push(Object e) {
ensureCapacity();
elements[size++] = e;
}
public Object pop() {
if (size == 0)
throw new EmptyStackException();
return elements[--size];
}
private void ensureCapacity() {
if (elements.length == size) {
Object[] oldElements = elements;
elements = new Object[2 * elements.length + 1];
System.arraycopy(oldElements, 0, elements, 0, size);
}
}
}
这个程序中潜伏着一个问题。不严格地讲,这个程序有一个“内存泄漏”,随着垃圾回收器活动的增加,或者由于不断增加的内存占用,程序性能的降低会 逐渐表现出来。在极端情况下,这样的内存泄漏会导致磁盘分页,甚至导致程序失败( O u t O f M e m o r y E r r o r错误),但是,这样的失败情形相对比较少见。
这种类似的东西,有没有人专门整理过啊,
期待有人能够共享一下。