java中的引用类型
强引用
内存溢出也不会清除对象。
软引用
SoftReference<byte[]> m = new SoftReference<>(new byte[1024]);
软引用适合缓存使用,堆空间不足就会清除掉软引用。
弱引用
WeakReference
只要有垃圾回收 就会回收对象。
虚引用
PhantomRerence
get不到。
管理直接内存,DirectByte
ThreadLocal
- set方法
首先 获取当前线程t,然后getMap(t)得到一个TreadLocalMap(当前t的成员变量),接着把tl的实力对象作为k,传进set方法的的值作为value,调用TreadLocalMap.set(this,value)的方法。TreadLocalMap.set()中,new Entry() extends WeakReference<>;
因为 Tread线程中有tl指向TreadLocal,TreadLocalMap中entry的key也指向TreadLocal。所以如果TreadLocalMap中的entry不设置为弱引用,即使tl置空,gc也不会收集TreadLocal。导致内存溢出