论坛首页 Java企业应用论坛

经典的JAVA内存泄露代码征集

浏览 28834 次
精华帖 (3) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (3)
作者 正文
   发表时间:2008-12-29  
有没有人总结过一些经典的常见的导致内存泄露的代码。
如果能将一些比较常见的导致内存泄露的代码整理出来的话,无论对于新手还是在项目组中进行代码检查都是能够省一些力气的吧。
我先整理两个:
反模式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错误),但是,这样的失败情形相对比较少见。

这种类似的东西,有没有人专门整理过啊,
期待有人能够共享一下。
   发表时间:2008-12-29  
我一直觉得资源没有正确释放不算java的内存泄漏,什么语言都会有这样的问题。
0 请登录后投票
   发表时间:2008-12-29  
罪恶的 non static  ThreadLocal object !
0 请登录后投票
   发表时间:2008-12-30  
在本机系统资源(如文件句柄、数据库连接构件等资源)不再使用后,如果未能清理它们,也会造成 Java 中的内存泄漏。这种类型的内存泄漏称为本机内存泄漏。这些类型的内存泄漏表现为,随着时间的推移会增加进程大小,而在 Java 堆使用量方面没有任何增加。

这种本机内存泄露和堆内存泄露算两种类型吧
0 请登录后投票
   发表时间:2009-01-01  
Session中
1 放置了不适当的数据,如大小不可控的数据,Array,list等
2 不适当的session设置,导致session无法失效

数据库查询时
大量数据查询未作控制,全部一次性载入内存
1 请登录后投票
   发表时间:2009-01-01  
jfeng_lee 写道
Session中
1 放置了不适当的数据,如大小不可控的数据,Array,list等
2 不适当的session设置,导致session无法失效

数据库查询时
大量数据查询未作控制,全部一次性载入内存

搞大数量的报表也会有如此问题,多个大报表并发,不仅内存会出状况,CPU也会吃不消。

1 请登录后投票
   发表时间:2009-01-01  
我有个疑问:
如果有个引用指向一个环形封闭的N个对象,这些对象有关联关系,或者依赖.、聚集...等等关系。
如果把引用设null,形封闭的N个对象会被垃圾回收吗?
0 请登录后投票
   发表时间:2009-01-01  
环形封闭这个问题早就被解决了.
0 请登录后投票
   发表时间:2009-01-03  
sdh5724 写道
环形封闭这个问题早就被解决了.

是阿?在哪能看到呢?
0 请登录后投票
   发表时间:2009-01-03   最后修改:2009-01-03
volking 写道
sdh5724 写道
环形封闭这个问题早就被解决了.

是阿?在哪能看到呢?

你可以看看APACHE的JDK的实现, 如何解决的, 另外OPENJDK也可以看到代码, 你去看看吧。 内存收集的算法很复杂的, 不是3言2语就能说清楚。 APACHE JDK听说代码写的是超级优雅,优雅之后的性能么, 我就哈哈哈哈咯, 你甚至可以自己写收集算法。 可以去玩玩哦:)
4 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics