Java中的内存泄漏:
内存泄漏是指一个对象或者变量不再被程序使用,却还在程序中占有存储空间。
C/C++中内存的释放由开发人员负责,如果开发人员忘了释放分配的内存空间将导致内存泄漏。Java中引入了垃圾回收机制,由垃圾回收器负责自动的将不再使用的垃圾对象进行回收。但是也会存在内存泄漏。原因如下:
Java 中判断一个对象是否符合垃圾回收的标准有两个:
- 给对象赋予了空值,以后再也没有使用过。
- 给对象赋予新的值,重新分配了内存空间。
而内存泄漏一般有两种情况:
- 堆中申请的空间没有释放
- 对象已经不再使用,但是在内存中占据存储空间。
由于java中有垃圾回收机制,因此第一种情况被有效解决。但是对于第二种情况,垃圾回收器没法保证不再使用的对象被释放。Java中内存泄漏指的第二种情况。
例子如下:
引起内存泄漏的原因如下:
- 静态集合类。例如HashMap,Vector等,由于这些集合类是静态的,生命周期和程序一致。容器中保存的对象在程序结束前不会被释放,从而造成内存泄漏。
- 各种连接。例如数据库连接,网络连接,IO连接等。在对数据库进行操作的时候,首先需要连接数据库,当数据库不再使用时候,需调用close方法释放数据库连接。只有连接被关闭,垃圾回收器才能回收对应的对象。如果不显式关闭Connection,Statement或者ResultSet,将导致大量对象无法被回收,从而引起内存泄漏。
- 监听器。释放对象的同时没有删除监听器也可能导致内存泄漏。
- 变量作用域不合理。变量定义的作用域大于其范围,将造成内存泄漏。
- 单例模式可能造成内存泄漏。