四种引用
- 强引用
- 软引用(内存不足时回收)
- 弱引用(gc回收)
- 虚引用(形同虚设,随时可能回收)
后三种都可以结合referenceQueue跟踪回收状态。带ReferenceQueue
的构造方法签名如下:
public WeakReference(T referent, ReferenceQueue<? super T> q) {
super(referent, q);
}
q.poll()
来获取队列里的元素,若能获取非空元素,则代表该目标已经无强引用,目前它是弱访问的,如果此时发生GC回收,那么将会被回收。而这也是一个内存逃逸的时机。亦或者是检查其被合理释放的时机。对于leakCanary
来说,便是在这里认为目标是弱访问的,便从观察列表里删除该元素。