Java Reference类


Java Reference类

Reference类时SoftReference、WeakReference、PhantomReference类的父类。

由于Reference与GC密切配合,Reference不应当被继承实现(Reference的所有构造方法都是包访问权限)。

Reference类的成员包括:

  1. referent,Reference类包装的对象引用
  2. queue,引用队列,通过构造函数传入,引用对象在队列上注册,确认引用对象的状态
  3. pending,等待队列

Reference对象四种状态:

  1. active,GC会特殊对待此状态的引用,一旦被引用的对象的可达性发生变化(如失去强引用,只剩弱引用,可以被回收),GC会将引用放入pending队列并将其状态改为pending状态
  2. pending,位于pending队列,等待ReferenceHandler线程将引用入队queue
  3. enqueue,ReferenceHandler将引用入队queue
  4. inactive,引用从queue出队后的最终状态,该状态不可变

一个弱引用的回收过程

1        Object o = new Object();
2        ReferenceQueue queue = new ReferenceQueue<>();
3        WeakReference wr = new WeakReference<>(o, queue);
4        o = null;
5        System.gc();
6        System.out.println(wr.get());
7        assert wr.get() == null;

  1. 第3行,wr创建,处于active状态
  2. 第4行,对象o失去强引用,第5行触发GC,回收器发现o的可达性发生变化,将referent置为null,此时wr.get返回null,将wr放入pending队列,wr进入pending状态,wr不关心o最终是否被回收
  3. ReferenceHandler线程从pending队列中取出wr,将其放入queue中,wr进入enqueue状态
  4. 调用queue.poll或queue.remove方法,wr出队,wr进入inactive状态

参考:http://hongjiang.info/java-referencequeue/
参考:http://mindprod.com/jgloss/phantom.html

你可能感兴趣的:(Java Reference类)