Java并发编程——ThreadLocal内存泄漏

看到有人说:Threadlocal的错误使用,会导致内存溢出,所以来分析一下源码。

(只展示关键部分)

 

1、ThreadLocal所存储的数据最终存在Entry对象,Entry对象虽然继承自弱引用,但是只和key值是弱引用关系,与value值是强引用关系。

所以,关系是:ThreadLocalMap拥有Entry的引用,Entry拥有value的引用。

 2、ThreadLocal并没有ThreadLocalMap的引用,因此即使将ThreadLocal声明成Static也不会对ThreadLocalMap造成任何影响。

但是,观察ThreadLocal的set函数,会发现,Thread(当前线程)中有ThreadLocalMap的引用,

结果显而易见:只要当前线程不死,资源就无法释放,一旦线程卡死,那么就会导致当前线程的值无法回收。

 

3、实在没办法,调用一下remove函数即可,函数最终会将对象置空

 

 

结论:

简而言之,就是 ThreadLocal 中的 value 与 Thread.currentThread() 是强引用关系,在 Thread 无法正常销毁的场景下,就有内存泄漏的隐患(例如:线程池)。

 

posted on 2019-08-22 00:36  疯狂的妞妞  阅读(164)  评论(0编辑  收藏  举报

导航