一 点睛
内存泄漏也称作“存储渗漏”。
严格来说,只有对象不会再被程序用到了,但是 GC 又不能回收他们的情况,才叫内存泄漏。
但实际情况很多时候一些不太好的实践(或疏忽)会导致对象的生命周期变得很长甚至导致 OOM,也可以叫做宽泛意义上的“内存泄漏”。
例如:某变量本可以定义为局部变量,但定义成了成员变量或类变量,导致变量的生命周期变长。
比如:web 开发中,某变量本没必要在会话级别定义,却定义了,导致变量的生命周期变长。
尽管内存泄漏并不会立刻引起程序崩溃,但是一旦发生内存泄漏,程序中的可用内存就会被逐步蚕食,直至耗尽所有内存,最终出现 OutOfMemory 异常,导致程序崩溃。也就是说内存泄漏有可能会导致内存溢出。
注意,这里的存储空间并不是指物理内存,而是指虚拟内存大小,这个虚拟内存大小取决于磁盘交换区设定的大小。
买房子:80 平的房子,但是有 10 平是公摊的面积,我们是无法使用这 10 平的空间,这就是所谓的内存泄漏
Java 使用可达性分析算法,最上面的数据不可达,就是需要被回收的。后期有一些对象不用了,按道理应该断开引用,但是存在一些链没有断开,从而导致没有办法被回收。
二 举例
1 单例模式
单例的生命周期和应用程序是一样长的,所以单例程序中,如果持有对外部对象的引用的话,那么这个外部对象是不能被回收的,则会导致内存泄漏的产生。
2 一些提供 close 的资源未关闭导致内存泄漏
数据库连接(dataSourse.getConnection() ),网络连接(socket)和 io 连接必须手动close,否则是不能被回收的。