内存泄露是指一个不再被程序使用的对象或变量还在内存中占用存储空间。
在Java语言中,判断一个内存空间是否符合垃圾回收的标准有两个:
①给对象赋予了空值null,以后再没有使用过;
②给对象赋予了新值,重新分配了内存空间。
内存泄露有两种情况:
①在堆中申请的空间没有被释放;(垃圾回收机制可以有效解决该问题)
②对象已不再被使用,但还仍然在内存中保留着。(Java中的内存泄露主要是该情况)
容易引起内存泄露的原因主要有以下几种:
1)静态集合类,如HashMap和Vector。如果这些容器为静态的,由于他们的生命周期与程序一致,那么容器中的对象在程序结束之前将不能被释放,从而造成内存泄露。
如下所示:
Vector v=new Vector(10); for(int i=0;i<10;i++){ Object o=new Object(); v.add(o); }
2)各种连接,例如数据库连接、网络连接以及IO连接等。
在对数据库进行操作的过程中,需要建立与数据库的连接(Connection,Statement,Resultset),当不再使用时,需要调用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 Singleton getInstance(){ return instance } }