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
來引用這個對象。當內存不足時,垃圾收集器可以回收這個對象,從而釋放內存。