概述

ThreadLocal 在 Java 中被用来提供线程局部变量。每个线程都可以通过其 ThreadLocal 变量获取它自己的值,这在线程隔离的上下文中是非常有用的。然而,ThreadLocal 确实存在内存泄漏的风险,这主要与其内部实现和生命周期管理有关。

内存泄露

内存泄漏风险的发生

  1. Entry 对象持有强引用:ThreadLocal 内部维护了一个 ThreadLocalMap,该 Map 的键是 ThreadLocal 的弱引用,但值是强引用。这意味着,即使 ThreadLocal 实例本身被垃圾回收了(因为它是弱引用),只要 ThreadLocalMap 还持有对值的强引用,那么这些值就不会被垃圾回收。

  2. ThreadLocalMap 的生命周期:ThreadLocalMap 是与线程关联的,它的生命周期与线程的生命周期一样长。如果线程长时间运行,并且 ThreadLocal 不再被使用,但 ThreadLocalMap 中的值仍然被强引用,那么这些值就会一直占用内存,导致内存泄漏。

ThreadLocal 内存泄露问题