内存泄漏的基本概念:
在 Java 中,内存泄漏就是存在一些不会再被使用却没有被回收的对象,这些对象有下面两个特点:
1. 这些对象是可达的,即在有向图中,存在通路可以与其相连;
2. 这些对象是无用的,即程序以后不会再使用这些对象。
如果对象满足这两个条件,这些对象就可以判定为 Java 中的内存泄漏,这些对象不会被 GC 所回收,然而它却占用内存。
2. 这些对象是无用的,即程序以后不会再使用这些对象。
如果对象满足这两个条件,这些对象就可以判定为 Java 中的内存泄漏,这些对象不会被 GC 所回收,然而它却占用内存。
内存泄露的根本原因是什么?
长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏,尽管短生命周期对象已经不再需要,
但是因为长生命周期持有它的引用而导致不能被回收,这就是 Java 中内存泄漏的发生场景。
15、举几个可能发生内存泄漏的情况?
1. 静态集合类引起的内存泄漏;
1. 静态集合类引起的内存泄漏;
2. 当集合里面的对象属性被修改后,再调用 remove() 方法时不起作用;
3. ***:释放对象的时候没有删除***;
4. 各种连接:比如数据库连接(dataSourse.getConnection()),网络连接(socket) 和 IO 连接,除非其显式的调用了其 close() 方法将其连接关闭,否则是不会自动被 GC 回收的;
5. 内部类:内部类的引用是比较容易遗忘的一种,而且一旦没释放可能导致一系列的后继类对象没有释放;
6. 单例模式:单例对象在初始化后将在 JVM 的整个生命周期中存在(以静态变量的方式),如果单例对象持有外部的引用,那么这个对象将不能被 JVM 正常回收,导致内存泄漏。
16、尽量避免内存泄漏的方法?
1. 尽量不要使用 static 成员变量,减少生命周期;
2. 及时关闭资源;
3. 不用的对象,可以手动设置为 null。