四种引用类型及引用队列

本文目录

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 sr = new SoftReference(new String("CacheData"));

// 获取数据
String str = sr.get();

// 断开强引用
str= null;

 

3 弱引用(WeakReference)

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

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

// 弱引用
WeakReference wr = new WeakReference(new String("CacheData"));

// 获取数据
String str = wr.get();

// 断开强引用
str= null;
 
// 弱引用Map
WeakHashMap whm = new WeakHashMap();

 

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

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

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

// 引用队列
ReferenceQueue rq = new ReferenceQueue();

// 幽灵引用
PhantomReference pr = new PhantomReference(new String(""), rq);

// 永远为null(幽灵引用相当于无引用)
System.out.println(pr.get());

 

5 引用队列(ReferenceQueue)

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

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

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

 

你可能感兴趣的:(Java)