对象的四种引用
强引用
先看图:
开发过程中我们一般用的都是强引用,强引用指向的堆内存不会被垃圾回收器回收!
软引用
先看图:
从图上可以看出,当我们内存不够的时候,软引用指向的堆内存会被回收!
弱引用
先看图:
从图可以看出,只要垃圾回收,弱引用指向的堆内存就会被回收!
Threadlocal的弱引用
先看图:
看set方法,如下图:
从图可以看出为什么threadlocal是线程独有,因为把值设置到了本地线程对象的map里.
接下来看下这个map的构造方法,看图:
重点是这个entry对象,如下图:
这里key使用了弱引用,为什么要这样处理?前面说了这个map是本地线程持有的,生命周期跟线程一样,假设threadlocal对象使用完之后,线程没结束,如果key使用强引用,那这个threadlocal还是不能被回收,会造成内存泄漏(内存浪费)! 看图:
那这里还存在个问题:value也是强引用,key失效其实value也应该要被回收,怎么办?
所以这里我们要调threadLocal.remove()方法,手动删除value,防止value导致的内存泄漏!
虚引用
先看图:
如图,虚引用必须结合引用队列使用,虚引用指向的对象将被回收时,会把对象引用存入相关联的队列中!记住这时候对象没有被回收!