Java Reference类
Reference类时SoftReference、WeakReference、PhantomReference类的父类。
由于Reference与GC密切配合,Reference不应当被继承实现(Reference的所有构造方法都是包访问权限)。
Reference类的成员包括:
- referent,Reference类包装的对象引用
- queue,引用队列,通过构造函数传入,引用对象在队列上注册,确认引用对象的状态
- pending,等待队列
Reference对象四种状态:
- active,GC会特殊对待此状态的引用,一旦被引用的对象的可达性发生变化(如失去强引用,只剩弱引用,可以被回收),GC会将引用放入pending队列并将其状态改为pending状态
- pending,位于pending队列,等待ReferenceHandler线程将引用入队queue
- enqueue,ReferenceHandler将引用入队queue
- inactive,引用从queue出队后的最终状态,该状态不可变
一个弱引用的回收过程
1 Object o = new Object();
2 ReferenceQueue<Object> queue = new ReferenceQueue<>();
3 WeakReference<Object> wr = new WeakReference<>(o, queue);
4 o = null;
5 System.gc();
6 System.out.println(wr.get());
7 assert wr.get() == null;
- 第3行,wr创建,处于active状态
- 第4行,对象o失去强引用,第5行触发GC,回收器发现o的可达性发生变化,将referent置为null,此时wr.get返回null,将wr放入pending队列,wr进入pending状态,wr不关心o最终是否被回收
- ReferenceHandler线程从pending队列中取出wr,将其放入queue中,wr进入enqueue状态
- 调用queue.poll或queue.remove方法,wr出队,wr进入inactive状态
参考:http://hongjiang.info/java-referencequeue/
参考:http://mindprod.com/jgloss/phantom.html