Java中的WeakReference
是一種特殊的引用類型,它允許對象在內存不足時被垃圾回收器回收。WeakReference
的生命周期與普通引用有所不同,主要體現在以下幾個方面:
創建WeakReference
對象:
WeakReference<MyObject> weakRef = new WeakReference<>(new MyObject());
這里,MyObject
實例被包裝在一個WeakReference
中。
獲取引用的對象:
MyObject obj = weakRef.get();
如果MyObject
實例仍然存在且未被回收,get()
方法將返回該實例;否則返回null
。
弱引用對象的回收條件:
引用隊列(ReferenceQueue):
WeakReference
與一個ReferenceQueue
關聯起來,當弱引用對象被回收時,該弱引用會被加入到關聯的引用隊列中。ReferenceQueue<MyObject> queue = new ReferenceQueue<>();
WeakReference<MyObject> weakRef = new WeakReference<>(new MyObject(), queue);
創建階段:
WeakReference
對象時,被引用的對象仍然存在。活躍階段:
get()
方法獲取到的對象是有效的。回收階段:
終結階段:
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
public class WeakReferenceExample {
public static void main(String[] args) {
ReferenceQueue<MyObject> queue = new ReferenceQueue<>();
WeakReference<MyObject> weakRef = new WeakReference<>(new MyObject(), queue);
// 獲取引用的對象
MyObject obj = weakRef.get();
System.out.println("Object: " + obj);
// 模擬內存不足的情況
obj = null;
System.gc();
// 檢查弱引用是否被回收
try {
Thread.sleep(100); // 等待一段時間讓GC有機會運行
} catch (InterruptedException e) {
e.printStackTrace();
}
obj = weakRef.get();
if (obj == null) {
System.out.println("Object has been garbage collected.");
} else {
System.out.println("Object is still alive: " + obj);
}
// 檢查引用隊列
WeakReference<? extends MyObject> polledRef = (WeakReference<? extends MyObject>) queue.poll();
if (polledRef != null) {
System.out.println("Weak reference enqueued: " + polledRef);
}
}
}
class MyObject {
@Override
protected void finalize() throws Throwable {
System.out.println("MyObject finalized.");
}
}
通過這個示例,可以看到弱引用對象在內存不足時是如何被垃圾回收器回收的,并且可以通過引用隊列來檢測這一過程。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。