美文网首页
java内存溢出和内存泄露

java内存溢出和内存泄露

作者: 棣琦_mm | 来源:发表于2019-03-31 12:12 被阅读0次

什么是内存溢出

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;

什么是内存泄露

内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

内存溢出和内存泄露的关系

memory leak会最终会导致out of memory

什么情况下会出现内存泄露

长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。具体主要有如下几大类:

  1. 静态集合类引起内存泄露:
    像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放,因为他们也将一直被Vector等引用着。
  2. 当集合里面的对象属性被修改后,再调用remove()方法时不起作用。
  3. 监听器
    在java 编程中,我们都需要和监听器打交道,通常一个应用当中会用到很多监听器,我们会调用一个控件的诸如addXXXListener()等方法来增加监听器,但往往在释放对象的时候却没有记住去删除这些监听器,从而增加了内存泄漏的机会。
  4. 各种连接
    比如数据库连接(dataSourse.getConnection()),网络连接(socket)和io连接,除非其显式的调用了其close()方法将其连接关闭,否则是不会自动被GC 回收的。对于Resultset 和Statement 对象可以不进行显式回收,但Connection 一定要显式回收,因为Connection 在任何时候都无法自动回收,而Connection一旦回收,Resultset 和Statement 对象就会立即为NULL。但是如果使用连接池,情况就不一样了,除了要显式地关闭连接,还必须显式地关闭Resultset Statement 对象(关闭其中一个,另外一个也会关闭),否则就会造成大量的Statement 对象无法释放,从而引起内存泄漏。这种情况下一般都会在try里面去的连接,在finally里面释放连接。
  5. 单例模式
    如果单例对象持有外部对象的引用,那么这个外部对象将不能被jvm正常回收,导致内存泄露。
    不正确使用单例模式是引起内存泄露的一个常见问题,单例对象在被初始化后将在JVM的整个生命周期中存在(以静态变量的方式),如果单例对象持有外部对象的引用,那么这个外部对象将不能被jvm正常回收,导致内存泄露

相关文章

  • JVM之内存模型

    Java内存内存区域图 内存泄露和内存溢出的区别 内存泄露是指分配出去的内存没有被回收回来 内存溢出是指程序所需要...

  • Java 中的内存溢出和内存泄露是什么?我给你举个有味道的例子​

    JAVA中的内存溢出和内存泄露分别是什么,有什么联系和区别,让我们来看一看。 内存泄漏 & 内存溢出 1. 内存泄...

  • JAVA内存区域

    首先解释下内存溢出和内存泄露之间的区别,为后面的学习做些铺垫: 1、内存溢出和内存泄露的区别和联系 内存溢出 ou...

  • JAVA内存区域

    首先解释下内存溢出和内存泄露之间的区别,为后面的学习做些铺垫: 1、内存溢出和内存泄露的区别和联系 内存溢出 ou...

  • 内存优化

    内存优化主要是分析内存泄露和内存溢出。将从内存是怎么分配,内存怎么出现泄露和溢出,用工具判断什么情况出现泄露,找出...

  • Java架构师中的内存溢出和内存泄露是什么?我给你举个有味道的例

    JAVA中的内存溢出和内存泄露分别是什么,有什么联系和区别,让我们来看一看。 01 内存泄漏 & 内存溢出 1. ...

  • java虚拟机-内存溢出与内存异常

    了解java虚拟机内存划分和各模块作用使得我们更加清楚如何使用内存,防止内存溢出和泄露。 一、Java内存区域的划...

  • Java内存溢出和内存泄露

    虽然jvm可以通过GC自动回收无用的内存,但是代码不好的话仍然存在内存溢出(OOM)风险。 一、为什么要了解内存泄...

  • java内存溢出和内存泄露

    什么是内存溢出 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out...

  • 【JAVA】内存泄露和内存溢出

    为什么会产生内存泄漏?当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回...

网友评论

      本文标题:java内存溢出和内存泄露

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