threadLocal如何避免内存泄漏
1.对象引用关系
- 线程持有threadLocalMap引用,threadLocalMap持有自定义entry元素的数组
- 每个entry持有一个key和value
- 这里的key被包装成一个弱引用,方便threadLocalRef出栈,或者被回收的时候,gc能够回收threadLocal
2. 什么是内存泄漏?
一些无法被再次使用的对象,因为存在强引用关系,无法被gc回收
造成该对象一直存在堆内存中,占用宝贵的的内存资源,造成资源浪费
最终还有可能造成内存溢出,导致程序终止
3. threadLocal是如何避免内存泄漏的?
在entry中key是tl(threadLocal),同时key被包装成一个弱引用,如果在堆栈中threadLocalRef被释放,那么在gc的时候key就会被回收,tl被释放
如果thread没有释放的话,比如线程池中的线程,value将一直被持有,所以tl内部会自己调用清理key==null的数组元素
但是tl的存在就是为了满足多线程操作,tl一般会被定义成static属性,不会被主动释放
这样的话tl内部自清理方法不能避免内存泄漏的风险
4. 手动调用remove方法释放threadLocal
tl虽然把entry中的key设置成WeakReference弱引用,但是并不能保证value被回收
最安全可靠的方法是在不需要使用tl的时候调用remove方法释放tl