多线程-强软弱虚

前言

Java中有强软弱虚四种引用。

强引用(Strong Reference)

正常用new声明的对象都是强引用。

强引用不会被垃圾回收。

软引用(Soft Reference)

  • 使用方法:

    1
    SoftReference<Object> m = new SoftReference<>(obj);
  • 特性:只有系统内存不够用时,被软引用指向的对象才会被回收。

  • 使用场景:memory cache

弱引用(Weak Reference)

  • 使用方法:

    1
    WeakReference<Object> m = new WeakReference<>(obj);
  • 特性:如果只有弱引用,只要遭遇垃圾回收,就会被回收。

  • 使用场景:

    • WeakHashMap
    • ThreadLocal:
      • ThreadLocal中的ThreadLocalMap的key就WeakReference
      • 由于ThreadLocalMap是Thread类的成员,因此其生命周期是和Thread相同的,该map中的key是ThreadLocal实例,如果某个ThreadLocal实例用完不用了,但由于map中还有对该实例的引用,因此,GC不会回收该对象,就会导致内存泄露,而使用弱引用之后,当外部的强引用消失之后,只剩弱引用,就会被回收了。
      • ThreadLocalMap中的value还是强引用,因此如果ThreadLocal不用了,还是要调用remove()方法。

虚引用(Phantom Reference)

  • 使用方法:

    1
    PhantomReference<Obj> m = new PhantomReference<>(obj, QUEUE);
  • 特性:

    • 如果只有虚引用,只要遭遇垃圾回收,就会被回收,回收后,QUEUE中会放入此对象
    • 检查QUEUE就能知道虚引用指向的对象是否被回收
  • 应用:用于管理堆外内存(Direct Memory)