ThreadLocal 内存泄漏的问题


前言

ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。但是如果滥用ThreadLocal,就可能会导致内存泄漏。

下面,我们将围绕三个方面来分析ThreadLocal 内存泄漏的问题

  1. ThreadLocal 实现原理

  2. ThreadLocal为什么会内存泄漏

  3. ThreadLocal 最佳实践

在 GC 时会被回收。

线程ThreadLocalMap里所有key为null的value。

但是这些被动的预防措施并不能保证不会内存泄漏:

  1. 使用static的ThreadLocal,延长了ThreadLocal的生命周期,可能导致的内存泄漏。

  2. 分配使用了ThreadLocal又不再调用get(),set(),remove()方法,那么就会导致内存泄漏。

线程池的情况下,没有及时清理ThreadLocal,不仅是内存泄漏的问题,更严重的是可能导致业务逻辑出现问题。所以,使用ThreadLocal就跟加锁完要解锁一样,用完就清理。

Java 堆内存溢出梗概分析

Java 内存模型 JMM 浅析

腾讯面试经历总结 已拿到Offer