0%

强引用、软引用、弱引用、虚引用

强引用(StrongReference)

正常的赋值语句生成的引用,只要强引用存在,与GC Roots对象有引用链,就不会被垃圾回收。

软引用(SoftReference)

虚拟机内存不够用时才会尝试回收软引用链接的对象,此次回收后还是不够用,才会抛出内存溢出的异常。

弱引用(WeakReference)

发生垃圾回收时,不论当前内存是否足够,都会回收弱引用链接的对象。

弱引用应用场景

官方文档:

假设垃圾收集器在某个时间点决定一个对象是弱可达的(weakly reachable)(也就是说当前指向它的全都是弱引用),这时垃圾收集器会清除所有指向该对象的弱引用,然后垃圾收集器会把这个弱可达对象标记为可终结(finalizable)的,这样它们随后就会被回收。与此同时或稍后,垃圾收集器会把那些刚清除的弱引用放入创建弱引用对象时所登记到的引用队列(Reference Queue)中。

实际上,WeakReference类有两个构造函数:

  • WeakReference(T referent) //创建一个指向给定对象的弱引用
  • WeakReference(T referent, ReferenceQueue<? super T> q) //创建一个指向给定对象并且登记到给定引用队列的弱引用

我们可以看到第二个构造方法中提供了一个ReferenceQueue类型的参数,通过提供这个参数,我们便把创建的弱引用对象注册到了一个引用队列上,这样当它被垃圾回收器清除时,就会把它送入这个引用队列中,我们便可以对这些被清除的弱引用对象进行统一管理。

参考:WeakReference才是LeakCanary真正的核心

虚引用(PhantomReference)

在虚引用链接的对象被垃圾回收后,虚引用会受到虚拟机的通知,并不能通过虚引用直接获得对象的实例,虚引用也不会影响对象的生命周期。

虚引用应用场景

DirectByteBuffer中对堆外内存的释放,通过虚引用监听DirectByteBuffer对象被GC回收后,再调用释放堆外内存的方法。