threadlocal与线程池产生的问题

 

 

 

 

ThreadLocal自身并不储存值,而是作为一个key来让线程从ThreadLocal获取value。Entry是中的key是弱引用,所以jvm在垃圾回收时如果外部没有强引用来引用它,ThreadLocal必然会被回收。但是,作为ThreadLocalMap的key,ThreadLocal被回收后,ThreadLocalMap就会存在null,但value不为null的Entry。若当前线程一直不结束,可能是作为线程池中的一员,线程结束后不被销毁,或者分配(当前线程又创建了ThreadLocal对象)使用了又不再调用get/set方法,就可能引发内存泄漏。其次,就算线程结束了,操作系统在回收线程或进程的时候不是一定杀死线程或进程的,在繁忙的时候,只会清除线程或进程数据的操作,重复使用线程或进程(线程id可能不变导致内存泄漏)。因此,key弱引用并不是导致内存泄漏的原因,而是因为ThreadLocalMap的生命周期与当前线程一样长,并且没有手动删除对应key。

线程池中的线程是没有被销毁的,线程用完后又要回收到线程池中的。如果一个线程不销毁,那么跟随这个线程的ThreadLocalMap就一直存在,上次变量的变更,下次依然在上面使用。解决方案为及时的remove。

此外针对threadlocal的内存泄漏问题,也需要我们及时remove。此外,若将threadlocal定义为private static则不会发生内存泄漏。

posted @ 2020-06-11 19:59  HEUzbc  阅读(643)  评论(0编辑  收藏  举报