WeakReference是Java语言规范中为了区别直接的对象引用(程序中通过构造函数声明出来的对象引用)而定义的另外一种引用关系。WeakReference标志性的特点是:reference实例不会影响到被应用对象的GC回收行为(即只要对象被除WeakReference对象之外所有的对象解除引用后,该对象便可以被GC回收),只不过在被对象回收之后,reference实例想获得被应用的对象时程序会返回null。
这里使用弱引用的原因:ThreadLocal目的就是达到变量只能自己访问别的线程不能访问的目的,Map设计的key为ThreadLocal实例的引用地址,value为变量,当线程存在而ThreadLocal实例被回收时,Map中的value还是存在的(原因后续说明)致使该变量的可达性分析失败,从而导致此阶段的内存泄露。当设计为弱引用后,如果key被销毁了(强引用销毁),那么value就处于可被回收状态,从而避免内存泄露。
临时内存泄露图示