定义:程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
产生原因:本应该被GC回收的无用对象没有被回收,导致的内存空间的浪费,当内存泄露严重时会导致OOM
分类:常发性内存泄漏,偶发性内存泄漏,一次性内存泄漏,隐式内存泄漏
应对方法(1) 尽量少使用枚举, 因为枚举是常量的一个集合, 你只是使用其中一个, 内部的所有枚举都会加载出来。
尽量使用静态内部类而不是内部类,因为如果内部类中做耗时操作,因为它会持有外部类的实例对象,导致外部类的实例在生命周期结束的时候没有办法及时释放,这就造成了内存泄漏。
尽量使用轻量级的数据结构, 在不使用的时候及记得即使使用clear()方法。
养成关闭连接和注销监听器的习惯, 在开启任何东西前把关闭都放在finally代码块中。
应对方法(2) 谨慎使用static关键字, 使用static表示这是一个静态量, JVM就会立即加载它, 如果不使用的话有一定的内存浪费。
谨慎使用单例模式, 单例模式好是好, 但是还是要确保这个单例一定是常使用到的, 而且最好是使用双重检验的懒汉模式下的单例模式。
例子:像HashMap、Vector等集合的使用最容易出现内存泄露。因为这些集合属于静态集合,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放,因为他们也将一直被Vector等引用着。