pull/6/head
yuanguangxin 4 years ago
parent 996bec2bb6
commit ab735ed7cd

@ -561,7 +561,9 @@ ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对
### ThreadLocal为什么要使用弱引用和内存泄露问题
Map中的key为一个threadlocal实例. 这个Map的确使用了弱引用,不过弱引用只是针对key.每个key都弱引用指向threadlocal.假如每个key都强引用指向threadlocal也就是上图虚线那里是个强引用那么这个threadlocal就会因为和entry存在强引用无法被回收造成内存泄漏 除非线程结束线程被回收了map也跟着回收。
Map中的key为一个threadlocal实例.如果使用强引用当ThreadLocal对象假设为ThreadLocal@123456的引用被回收了ThreadLocalMap本身依然还持有ThreadLocal@123456的强引用如果没有手动删除这个key则ThreadLocal@123456不会被回收所以只要当前线程不消亡ThreadLocalMap引用的那些对象就不会被回收可以认为这导致Entry内存泄漏。
如果使用弱引用那指向ThreadLocal@123456对象的引用就两个ThreadLocal强引用和ThreadLocalMap中Entry的弱引用。一旦ThreadLocal强引用被回收则指向ThreadLocal@123456的就只有弱引用了在下次gc的时候这个ThreadLocal@123456就会被回收。
虽然上述的弱引用解决了key也就是线程的ThreadLocal能及时被回收但是value却依然存在内存泄漏的问题。当把threadlocal实例置为null以后,没有任何强引用指向threadlocal实例,所以threadlocal将会被gc回收.map里面的value却没有被回收.而这块value永远不会被访问到了. 所以存在着内存泄露,因为存在一条从current thread连接过来的强引用.只有当前thread结束以后, current thread就不会存在栈中,强引用断开, Current Thread, Map, value将全部被GC回收.所以当线程的某个localThread使用完了马上调用threadlocal的remove方法,就不会发生这种情况了。

Loading…
Cancel
Save