# 什么是内存泄漏?
在 Java 中,内存泄漏是指一些不再被使用的对象占用的内存无法被垃圾回收器回收,从而导致内存资源的浪费和可能的内存不足问题。
# ThreadLocal 原理
每个 thread实例 都有一个 `ThreadLocalMap threadLocals` 的成员属性,当使用threadLocal存储数据时,就会去操作 当前线程的 `ThreadLocalMap threadLocals`成员变量,将当前的threadLocal作为key存储,即当前 thread.threadLocals.set(threadLocal, value)
# ThreadLocal 为什么会内存泄漏?
ThreadLocal
的作用是提供线程局部变量,每个线程都有自己独立的变量副本。它的实现原理是通过Thread
类中的ThreadLocalMap
来存储每个线程的变量副本。当一个
ThreadLocal
对象不再被外部引用时,如果线程一直持续运行 且 没有对该ThreadLocal
对应的ThreadLocalMap
中的条目进行清理,就可能导致内存泄漏。因为即使ThreadLocal
对象本身没有被引用了,但它在ThreadLocalMap
中对应的键值对还存在,其值占用的内存就无法被回收。
即
1、线程运行时间长
且
2、未对
ThreadLocalMap
中的条目进行清理
# 如何避免threadLocal内存泄漏?
养成良好的编程习惯,在不再需要ThreadLocal
变量时及时调用remove()
方法进行清理,以确保无论在何种线程环境下都能最大程度地避免内存泄漏的发生 。