问题的起因在于网上的资料广泛地说ThreadLocal使用弱引用避免内存泄漏。
可是当线程TERMINATED后,对应线程的实例不被GC吗?(当然,此处不考虑线程池那种一个线程复用的情况。)
线程对应的实例如果被GC了,那么实例内部的成员变量所保持的强引用不复存在,进而成员变量threadLocals指向的堆上的映射表被GC,于是映射表内部对每个键值对中键,值的强引用不复存在,下一次GC不就会把堆上的键和值都GC了么?这样不使用弱引用不也没有造成内存泄漏么?
谢谢
问题的起因在于网上的资料广泛地说ThreadLocal使用弱引用避免内存泄漏。
可是当线程TERMINATED后,对应线程的实例不被GC吗?(当然,此处不考虑线程池那种一个线程复用的情况。)
线程对应的实例如果被GC了,那么实例内部的成员变量所保持的强引用不复存在,进而成员变量threadLocals指向的堆上的映射表被GC,于是映射表内部对每个键值对中键,值的强引用不复存在,下一次GC不就会把堆上的键和值都GC了么?这样不使用弱引用不也没有造成内存泄漏么?
谢谢
15 回答8.3k 阅读
8 回答6.2k 阅读
4 回答4.4k 阅读✓ 已解决
4 回答4k 阅读
1 回答2.9k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
不管线程会不会被复用的情况,ThreadLocal变量的值对象是保持着至少两个引用指向它:
当线程销毁的时候,如果ThreadLocal没有及时remove掉,其实只是把1)引用去掉,2)引用仍然保留,此时值对象因为被引用,导致GC不会回收它。
下面我的一个图,可以帮助你理解: