Java中的内存泄漏:

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

C/C++中内存的释放由开发人员负责,如果开发人员忘了释放分配的内存空间将导致内存泄漏。Java中引入了垃圾回收机制,由垃圾回收器负责自动的将不再使用的垃圾对象进行回收。但是也会存在内存泄漏。原因如下:

Java 中判断一个对象是否符合垃圾回收的标准有两个:

  1. 给对象赋予了空值,以后再也没有使用过。
  2. 给对象赋予新的值,重新分配了内存空间。

而内存泄漏一般有两种情况:

  1. 堆中申请的空间没有释放
  2. 对象已经不再使用,但是在内存中占据存储空间。

由于java中有垃圾回收机制,因此第一种情况被有效解决。但是对于第二种情况,垃圾回收器没法保证不再使用的对象被释放。Java中内存泄漏指的第二种情况。

例子如下:

 

 

引起内存泄漏的原因如下:

  1. 静态集合类。例如HashMap,Vector等,由于这些集合类是静态的,生命周期和程序一致。容器中保存的对象在程序结束前不会被释放,从而造成内存泄漏。
  2. 各种连接。例如数据库连接,网络连接,IO连接等。在对数据库进行操作的时候,首先需要连接数据库,当数据库不再使用时候,需调用close方法释放数据库连接。只有连接被关闭,垃圾回收器才能回收对应的对象。如果不显式关闭Connection,Statement或者ResultSet,将导致大量对象无法被回收,从而引起内存泄漏。
  3. 监听器。释放对象的同时没有删除监听器也可能导致内存泄漏。
  4. 变量作用域不合理。变量定义的作用域大于其范围,将造成内存泄漏。
  5. 单例模式可能造成内存泄漏。