ThreadLocalMap
中使⽤的key
为ThreadLocal
的弱引⽤,⽽value
是强引⽤。所以,如果ThreadLocal
没有被外部强引⽤的情况下,在垃圾回收的时候,key
会被清理掉,⽽value
不会被清理掉。这样⼀ 来,ThreadLocalMap
中就会出现key
为null
的Entry
。假如我们不做任何措施的话,value
永远⽆法被 GC 回收,这个时候就可能会产⽣内存泄露。ThreadLocalMap
实现中已经考虑了这种情况,在调⽤set()
、get()
、remove()
⽅法的时候,会清理掉key
为null
的记录。使⽤完ThreadLocal
⽅法后 最好⼿动调⽤remove()
⽅法
static class Entry extends WeakReference < ThreadLocal << ? >> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal << ? > k, Object v) {
super(k);
value = v;
}
}
弱引⽤介绍:
如果⼀个对象只具有弱引⽤,那就类似于可有可⽆的⽣活⽤品。弱引⽤与软引⽤的区别在于:只具有弱引⽤的对象拥有更短暂的⽣命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,⼀旦发现了只具有弱引⽤的对象,不管当前内存空间⾜够与否,都会回收它的内存。不过,由于垃圾回收器是⼀个优先级很低的线程, 因此不⼀定会很快发现那些只具有弱引⽤的对象。弱引⽤可以和⼀个引⽤队列(ReferenceQueue)联合使⽤,如果弱引⽤所引⽤的对象被垃圾回收,Java 虚拟机就会把这个弱引⽤加⼊到与之关联的引⽤队列中。
留言