阅读量:0
WeakReference
是Java中的一个类,它允许你持有一个对象的弱引用。弱引用与强引用不同,强引用会一直保留对象,直到这个引用被清除。而弱引用则不会,一旦对象只被弱引用所引用,它就有可能在任何时候被垃圾收集器回收。
WeakReference
的工作原理主要基于垃圾收集器的运行时机。当垃圾收集器工作时,它会检查所有存活的对象。如果一个对象只被弱引用所引用,那么它就被认为是不可达的,因此可以被回收。
这里有一个简单的例子来说明WeakReference
是如何工作的:
import java.lang.ref.WeakReference; public class WeakReferenceExample { public static void main(String[] args) { ReferenceQueue<Object> queue = new ReferenceQueue<>(); WeakReference<Object> weakRef = new WeakReference<>(new Object(), queue); System.out.println("Before GC:"); System.out.println("WeakReference: " + weakRef); System.out.println("Queue: " + queue); // 强制进行垃圾收集 System.gc(); try { // 等待垃圾收集器处理完引用队列中的弱引用 queue.remove(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("After GC:"); System.out.println("WeakReference: " + weakRef); System.out.println("Queue: " + queue); } }
在这个例子中,我们创建了一个WeakReference
对象,它引用了一个新创建的对象和一个ReferenceQueue
对象。然后我们强制进行垃圾收集,并等待垃圾收集器处理完引用队列中的弱引用。
运行这个程序,你可能会看到类似以下的输出:
Before GC: WeakReference: java.lang.ref.WeakReference@<hashcode> Queue: java.lang.ref.ReferenceQueue@<hashcode> After GC: WeakReference: null Queue: java.lang.ref.ReferenceQueue@<hashcode>
在这个例子中,我们可以看到,在垃圾收集器运行之后,WeakReference
对象已经被回收,变成了null
。这是因为垃圾收集器发现这个对象只被弱引用所引用,所以认为它是不可达的,并回收了它。
WeakReference
通常用于实现内存敏感的高速缓存。例如,如果你有一个大型的对象,你不希望它一直占用内存,你可以使用WeakReference
来引用这个对象。当内存不足时,垃圾收集器可以回收这个对象,从而释放内存。