强引用:就是普通引用,new一个对象的时候就是一个强引用,当他没有任何引用指向这个对象的时候,就会被回收
软引用:WeakReference 主要用于缓存,空间不够的时候会被GC.这里设置的20M,因为上面用了10M,下面再用12M内存不够了,所以他回收了软引用的对象,当然这里还有一个问题我没有搞清楚,就是我下面如果用15M的时候会抛OOM的异常,有知道的大佬可以评论告诉我原因吗?
弱引用:被GC看到就会回收,典型应用ThreadLocal
虚引用:主要管理堆外内存,大家知道就行了,调用不到数据
下面我们来讲一下ThreadLocal。ThreadLocal是线程本地变量,他绑定在每个线程上,通俗的讲就是每个线程自己独立拥有,线程存在,ThreadLocal就一直存在。那么我们来看个例子
如图输出的是空,这是因为不同的线程threadLocal调不到另一个线程的数据的,那他是怎么来实现的呢,我们来看一下源码
我们会发现,所谓的ThreadLocal.set() 方法其实并不是往他里面set,而是set到了一个Thread对象的map里面,threadlocal当key存储了数据,所以这里他能实现不通线程调到的数据是不一样的
大家再来看set方法里有一个entry对象,这个对象就相当于map里的一条数据那么我们点进去看一下他发现entry继承了一个弱引用,指向了ThreadLocal,大家想想为什么这里要使用弱引用?
是因为你不想用这个ThreadLocal对象的话,你将它砍掉的时候,垃圾回收器会顺利的回收,不会存在内存泄露的现象,当然这里因为ThreadLocal当key存在map中,key被回收掉了,实际上value还在,所以大家一定要记得不使用这个对象的时候要调用remove方法给他删除掉,不然也是会造成内存泄露的。