四种引用类型及引用队列

来源:互联网 发布:mac表老化时间 编辑:程序博客网 时间:2024/05/21 06:44

本文目录

1 强引用(StrongReference)

2 软引用(SoftReference)

3 弱引用(WeakReference)

4 幽灵引用/虚引用(PhantomReference)

5 引用队列(ReferenceQueue)



1 强引用(StrongReference)

效果:存在强引用的对象,不会被JVM回收。

// 强引用String str = new String("Reference");


回收:当所有的强引用都断开后,在JVM进行垃圾回收时,该对象会被回收。

// 置空obj = null;// 指向另一对象obj= newObject();


2 软引用(SoftReference)

效果:存在软引用的对象,在内存不足时,才会被JVM回收。

应用:缓存数据,提高数据的获取速度。

// 软引用:缓存数据SoftReference<String> sr = newSoftReference<String>(new String("CacheData"));// 获取数据String str = sr.get();// 断开强引用str= null;


3 弱引用(WeakReference)

效果:存在弱引用的对象,每次JVM进行垃圾回收时,该对象都会被回收。

应用:短时间缓存某些次要数据。

// 弱引用WeakReference<String> wr = newWeakReference<String>(new String("CacheData"));// 获取数据String str = wr.get();// 断开强引用str= null; // 弱引用MapWeakHashMap<String, String> whm = new WeakHashMap<String,String>();


4 幽灵引用/虚引用(PhantomReference)

效果:相当于无引用,使对象无法被使用,必须与引用队列配合使用。

应用:使对象进入不可用状态,等待下次JVM垃圾回收,从而使对象进入引用列队中。

// 引用队列ReferenceQueue<String> rq = newReferenceQueue<String>();// 幽灵引用PhantomReference<String> pr = newPhantomReference<String>(new String(""),rq);// 永远为null(幽灵引用相当于无引用)System.out.println(pr.get());


5 引用队列(ReferenceQueue)

效果:引用队列可以配合软引用、弱引用及幽灵引用使用,当引用的对象将要被JVM回收时,会将其加入到引用队列中。

应用:通过引用队列可以了解JVM垃圾回收情况。

// 引用队列ReferenceQueue<String> rq = newReferenceQueue<String>(); // 软引用SoftReference<String> sr = newSoftReference<String>(new String("Soft"),rq);// 弱引用WeakReference<String> wr = newWeakReference<String>(new String("Weak"),rq);// 幽灵引用PhantomReference<String> pr = newPhantomReference<String>(new String("Phantom"),rq); // 从引用队列中弹出一个对象引用Reference<? extends String> ref = rq.poll();