内存泄漏是指也给不在被程序使用的对象或变量还在内存中占有存储空间。主要有两种情况:
- 在堆中申请的空间没有被释放;
- 是对象已不再被使用,但还仍然在内存中保留着。
容易引起内存泄漏的原因主要有以下几个方面:
- 静态集合类,例如HashMap和Vector。如果这些容器为静态,由于它们的生命周期与程序一致,那么容器中的对象在程序结束之前将不能被释放,从而造成内存泄漏。
- 各种连接,例如数据库连接、网络连接以及IO连接等。在对数据库进行操作的过程中,首先需要建立与数据库的连接,当不再使用时,需要调用close()方法来释放与数据库的连接。只有连接关闭后,垃圾回收器才会回收对应的对象。否则,如果在访问数据库的过程中,对Connection、Statement或ResultSet不显示地关闭,将会造成大量的对象无法被回收,引起内存泄漏。
- 监听器。在Java中,通常也给应用中会用到多个监听器,但是在释放对象的同时往往没有相应地删除监听器,这也可能导致内存泄漏。
- 变量不合理的作用域。如果一个变量定义的作用范围大于它的使用范围,很可能会造成内存泄漏,另一方面如果没有及时地把对象设置null,很可能导致内存泄漏。
- 单例模式可能造成内存泄漏。