欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

内存泄漏

程序员文章站 2022-03-02 14:37:19
...

什么是内存泄漏

内存泄漏是指一个不再被程序使用的对象或变量还在内存中找有存储空间。

内存泄漏主要有两种情况:一是在堆中申请的空间没有被释放;二是对象已经不再被使用但仍然在内存中保留着。垃圾回收机制可以有效地解决第一种情况,对于第二种情况垃圾回收机制无法保证不再使用的对象会被释放。因此Java中的内存泄漏主要指第二种情况。

引起内存泄漏的原因

(1)静态集合类,例如HashMap和Vector,如果这些容器为静态的,由于它们的生命周期与程序一致,那么容器中的对象在程序结束之前将不能被释放,从而造成内存泄漏。

(2)各种连接,例如数据库连接、网络连接以及IO连接等。在对数据进行操作的过程中首先要建立数据库连接,当不再使用时需要调用close方法来释放与数据库的连接。

(3)监听器,通常一个应用会用到多个监听器,但在释放对象的同时往往没有删除相应的监听器,这也可能导致内存泄漏。

(4)变量不合理的作用域。一般而言,如果一个变量定义的作用域大于其使用范围,很有肯能造成内存泄漏,另一方面如果没有及时把对象设置为null,很有可能会导致内存泄漏。

(5)单例模式可能会造成内存泄漏。单例模式的实现有很多种,以下方式可能会造成内存泄漏。

class BigClass{
//class body
}
class Singleton{
    private BigClass bc;
    private static Singleton instance=new Singleton(new BigClass());
    private Singleton(BigClass bc){this.bc=bc;}

    public static Singleton getInstance() {
        return instance;
    }
}

在上述实现的单例模式中,Singleton存在一个对对象BigClass的引用,由于单例对象以静态变量的方式存储,因此在JVM整个生命周期都存在,同时由于它有一个对对象的引用,会导致BigClass类的对象不能够被回收。

相关标签: 内存泄漏