Java 面试题
目录

Java 中常见的内存泄漏场景有哪些?

· 约 5 分钟读完 · 第 148 / 274 章

推荐答案

在Java中,常见的内存泄漏场景包括:

  1. 静态集合类:静态集合类的生命周期与应用程序一致,如果集合中存储的对象不再使用但没有被移除,会导致内存泄漏。
  2. 未关闭的资源:如数据库连接、文件流、网络连接等未显式关闭,可能导致内存泄漏。
  3. 监听器和回调:注册了监听器或回调但没有取消注册,导致对象无法被垃圾回收。
  4. 内部类持有外部类引用:非静态内部类隐式持有外部类的引用,如果内部类的生命周期长于外部类,可能导致外部类无法被回收。
  5. 缓存未清理:缓存中的数据如果没有设置合理的过期策略或清理机制,可能导致内存泄漏。
  6. ThreadLocal使用不当:ThreadLocal变量如果没有及时清理,可能导致内存泄漏,尤其是在线程池中。

本题详细解读

1. 静态集合类

静态集合类的生命周期与应用程序一致,如果集合中存储的对象不再使用但没有被移除,会导致内存泄漏。例如:

在这个例子中,list是静态的,即使obj不再使用,它仍然存在于list中,导致内存泄漏。

2. 未关闭的资源

未关闭的资源如数据库连接、文件流、网络连接等可能导致内存泄漏。例如:

如果fis.close()没有被调用,文件流将不会被释放,导致内存泄漏。

3. 监听器和回调

注册了监听器或回调但没有取消注册,可能导致内存泄漏。例如:

如果listener不再使用但没有调用removeListener,listener将无法被垃圾回收。

4. 内部类持有外部类引用

非静态内部类隐式持有外部类的引用,如果内部类的生命周期长于外部类,可能导致外部类无法被回收。例如:

如果InnerClass的实例被长期持有,OuterClass的实例也将无法被回收。

5. 缓存未清理

缓存中的数据如果没有设置合理的过期策略或清理机制,可能导致内存泄漏。例如:

如果缓存中的数据没有被清理,可能导致内存泄漏。

6. ThreadLocal使用不当

ThreadLocal变量如果没有及时清理,可能导致内存泄漏,尤其是在线程池中。例如:

如果threadLocal.remove()没有被调用,线程池中的线程可能会持有threadLocal的值,导致内存泄漏。