zoukankan      html  css  js  c++  java
  • 经典的JAVA内存泄露代码征集

    经典的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错误),但是,这样的失败情形相对比较少见。

    这种类似的东西,有没有人专门整理过啊,
    期待有人能够共享一下。
  • 相关阅读:
    如何在mysql客户端即mysql提示符下执行操作系统命令
    干掉safedog命令
    面试题-----判断两个无环单链表是否交叉,如果交叉返回交叉点
    面试题-----单链表的反转
    面试题-----ICMP协议简介
    面试题-------SSL协议简介
    面试题-----求单链表的倒数第k个节点
    面试题---两个有序单链表的合并
    面试题---求一个串中的最大连续递增数字串
    面试题---两个大整数相乘
  • 原文地址:https://www.cnblogs.com/danghuijian/p/4400810.html
Copyright © 2011-2022 走看看