强引用
- M m = new M();
- 没有任何引用指向该对象时, 该对象就能被回收,最常用的引用
软引用
- SoftReference<byte[]> m = new SoftReference<>(new byte[1024]); SoftReference 软引用 byte 数组
- 内存不足及回收,常用于缓存
弱引用
- WeakReference<M> m = new java.lang.ref.WeakReference<>(new M());
- 垃圾回收器看到即回收, 用于ThreadLocal等
虚引用
- java.lang.ref.PhantomReference<M> m = new java.lang.ref.PhantomReference<>(new M(),QUEUE);
- 关联堆外内存,随时能被回收,无法被get,被回收时自动存入队列,用于 管理堆外内存(NIO等)
ThreadLocal 为什么使用弱引用
- 防止内存泄露
- ThreadLocal 以自身为 key,T为value 存储在 ThreadLocalMap中 (弱引用)
- ThreadLocalMap 存储在 Thread中, Thread 存在于线程池中,因此,强引用下 ThreadLocal 永远可达,永远不会被回收
- 在线程中,有对象使用 ThreadLocal 时(强引用) ,也不会被回收,因此,不会被误回收
- ThreadLocal 虽然是弱引用,但是ThreadLocal仅作为KEY,因此,如果没有显示调用remove,v 的删除会在set时,resize 方法中被清除
网友评论