Java 强软弱虚引用
本文参考内容:
https://www.51cto.com/article/686209.html

本文分成以下几个部分:
介绍强软弱虚四种引用
为什么在ThreadLocal中使用的是WeakReference
ThreadLocal中出现的内存泄露的问题

强引用
强引用不用多说,我们主要写的代码都是强引用:
句柄a放在虚拟机栈上,new创建出来的A放在堆中。设置a = null就会使得在堆中的A没有被引用到,这样就会被gc。
软引用
软引用会在内存不足时被释放:
设置内存为20M,输出为:
当创建第二个内存为10M的byte数组时,内存不够,就会回收软引用。
弱引用
弱引用会在gc的时候直接被释放,不管有无空闲的内存:
第二个输出为空
虚引用
通过虚引用的get方法只能返回null,而且虚引用必须要和Reference队列联合使用。它主要是实现一个对象回收的监听过程。

ThreadLocal部分源码分析
ThreadLocal是基于一个类似于Map的结构实现的保证线程数据的独立性:

ThreadLocalMap是基于Entry的结构:
Entry是一个WeakReference,同时在Entry的构造方法中也将ThreadLocal套了一层弱引用。

所以在栈区,tl句柄强引用指向对重的ThreadLocal,同时栈区的Key也通过弱引用的方式指向Threadlocal。这样我们不想使用ThreadLocal时,tl= null,然后gc就可以清除掉ThreadLocal。但是此时,Value对象还有强引用指向,所以Value对象可能会造成泄漏,只能等到线程结束。
总而言之,如果所示:
