Java reference是什么?让我们一起来了解一下吧!
Java Reference是java中的引用类,它的作用是用来给普通对象进行包装,从而在JVM在GC时,按照引用类型的不同,在回收时采用不同的逻辑。java主要有4种引用方式。它们分别是强引用StrongReference、软引用SoftReference、弱引用WeakReference和虚引用PhantomReference。
softreference引用示例:
ReferenceQueue referenceQueue = new ReferenceQueue<>(); SoftReference softReference = new SoftReference<>("abc", referenceQueue); System.gc(); System.out.println(softReference.get()); Reference reference = referenceQueue.poll(); System.out.println(reference);
PhantomReference引用示例:
public class PhantomReferenceTest { public static void main(String[] args) { ReferenceQueue rq = new ReferenceQueue<>(); PhantomReference reference = new PhantomReference<>(new String("cord"), rq); System.out.println(reference.get()); System.gc(); System.runFinalization(); System.out.println(rq.poll() == reference); } }
WeakReference引用示例:
public class WeakReferenceTest { public static void main(String[] args) { ReferenceQueue rq = new ReferenceQueue<>(); //这里必须用new String构建字符串,而不能直接传入字面常量字符串 Reference r = new WeakReference<>(new String("java"), rq); Reference rf; //一次System.gc()并不一定会回收A,所以要多试几次 while((rf=rq.poll()) == null) { System.gc(); } System.out.println(rf); if (rf != null) { //引用指向的对象已经被回收,存入引入队列的是弱引用本身,所以这里最终返回null System.out.println(rf.get()); } } }
下面是Reference中的几个关键属性:
//关联的对象的引用,根据引用类型不同gc针对性处理 private T referent; //引用注册的队列,如果有注册队列则回收引用会加入该队列 volatile ReferenceQueue queue; //上面引用队列referenceQueue中保存引用的链表 /* active: NULL //未加入队列前next指向null * pending: this * Enqueued: next reference in queue (or this if last) * Inactive: this */ Reference next; /* When active: 由gc管理的引用发现链表的下一个引用 * pending: pending链表中的下一个元素 * otherwise: NULL */ transient private Reference discovered; /* used by VM */ /* *等待入队列的引用链表,gc往该链表加引用对象,Reference-handler线程消费该链表。 * 它通过discovered连接它的元素 */ private static Reference pending = null;
以上就是小编今天的分享了,希望可以帮助到大家。