java引用类型

强引用

  • M m = new M();
  • 没有任何引用指向该对象时, 该对象就能被回收,最常用的引用

软引用

  • SoftReference m = new SoftReference<>(new byte[1024]); SoftReference 软引用 byte 数组
  • 内存不足及回收,常用于缓存

弱引用

  • WeakReference m = new java.lang.ref.WeakReference<>(new M());
  • 垃圾回收器看到即回收, 用于ThreadLocal等

虚引用

  • java.lang.ref.PhantomReference 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 方法中被清除

你可能感兴趣的:(java引用类型)