前置知识: Java

ThreadLocal内存泄漏

00:00
1 min Advanced 2026/6/14

Java ThreadLocal内存泄漏原因与解决方案。

1. 泄漏原因

ThreadLocal 存储在 Thread 的 ThreadLocalMap 中,key 是弱引用,value 是强引用

Thread → ThreadLocalMap → Entry[WeakRef<ThreadLocal>, value]
                              ↑ 弱引用           ↑ 强引用

ThreadLocal 对象回收后,key 变为 null,但 value 仍被强引用,无法回收

2. 解决方案

ThreadLocal<Connection> tl = new ThreadLocal<>();

try {
    tl.set(connection);
    // 使用 tl.get()
} finally {
    tl.remove();  // 必须手动清理!
}

3. 线程池中的风险

ExecutorService pool = Executors.newFixedThreadPool(10);

// 线程被复用,ThreadLocal 值不会自动清理
pool.submit(() -> {
    tl.set(data);
    // 忘记 remove → 下一个任务可能读到脏数据
});

4. 最佳实践

  • 使用后必须 remove()
  • 声明private static final
  • 使用 try-finally 确保清理

知识检测

学习进度

-- 已学文档
--% 知识覆盖率

学习推荐

专注模式