美文网首页
jvm内存泄漏原因及处理

jvm内存泄漏原因及处理

作者: 泽林呗 | 来源:发表于2019-03-15 16:51 被阅读0次

    关于这题也答得很烂,虽然之前已经看过了,但是可能是死记硬背的原因,答得太模糊了。
    Java中的内存泄露,广义并通俗的说,就是:不再会被使用的对象的内存不能被回收,就是内存泄露。

    如果长生命周期的对象持有短生命周期的引用,就很可能会出现内存泄露。

    public class Simple   {
           Object object;
           void method () {
                  object = new Object();
            }
    }
    

    就像上面的代码,严格意义上就是一种内存泄漏,因为object不再被使用了,但它不会被立即回收,而是得等到Simple对象被释放的时候。
    可以这样写

    public class Simple   {
           Object object;
           void method () {
                  Object object = new Object();
                  //使用Object
                  object = null;
            }
    }
    

    把Object定义为局部变量,并在最后赋值为null

    因此,解决内存泄漏的一个方法,就是尽量降低变量的作用域,以及及时把对象复制为可清理对象(null)

    如ArrayList的pop()方法

    public E pop(){
        if(size == 0)
            return null;
        else{
              E e = (E) elementData[--size];
              elementData[size] = null;
              return e;
      }
    }
    

    容器使用时的内存泄漏

          Vector vector = new Vector();
          for (int i = 1; i<100; i++)
        {
              Object object = new Object();
              vector.add(object);
              object = null;
          }
          //...对vector的操作
          //...与vector无关的其他操作
    }
    

    这里其实只是会造成短暂的内存泄漏,在method方法结束后还是会把回收的,更好的写法是:

          Vector vector = new Vector();
          for (int i = 1; i<100; i++)
        {
              Object object = new Object();
              vector.add(object);
              object = null;
          }
          //...对vector的操作
          vector = null;
          //...与vector无关的其他操作
    }
    

    close()方法导致的内存泄漏

    在各种IO或者数据库连接时,都需要在最后通过close()方法释放对象,这里也是长对象引用短对象是造成的内存泄漏

    SessionFactory factory = new SessionFactory();
    try {Session session = factory.connect();
    } finally{
          session.close();
    }
    

    这里必须用close关闭连接,因为SessionFactory是长对象,session是短对象。

    参考文章:https://blog.csdn.net/anxpp/article/details/51325838

    相关文章

      网友评论

          本文标题:jvm内存泄漏原因及处理

          本文链接:https://www.haomeiwen.com/subject/evlrmqtx.html