四种引用

  • 强引用
  • 软引用(内存不足时回收)
  • 弱引用(gc回收)
  • 虚引用(形同虚设,随时可能回收)

后三种都可以结合referenceQueue跟踪回收状态。带ReferenceQueue的构造方法签名如下:

    public WeakReference(T referent, ReferenceQueue<? super T> q) {
        super(referent, q);
    }
我们可以使用q.poll()来获取队列里的元素,若能获取非空元素,则代表该目标已经无强引用,目前它是弱访问的,如果此时发生GC回收,那么将会被回收。而这也是一个内存逃逸的时机。亦或者是检查其被合理释放的时机。对于leakCanary来说,便是在这里认为目标是弱访问的,便从观察列表里删除该元素。