首先先看到這張圖
當我們 Create 出一個 Object 的時候,這一塊記憶體會被存進 heap 裡面,而變數 a 會被存進 stack 裡面。
A a = new A();
當 GC(Garbage Collection)要回收 A()這塊記憶體時,會發現 a 指向 A()這塊記憶體,於是無法回收,這就是 Strong Reference。
Weak Reference
將程式碼改寫成這樣呢?
A a1 = new A();WeakReference<A> weakA = new WeakReference<A>(a1);a1=null;
while (true) { if (weakA.get() != null) { System.out.println(weakA.get().id); } else {
System.out.println("A has been collected.");
}
}
注意到這邊:在 GC 運行時,發現是 Weak Reference,不管記憶體空間是否足夠,都會將 Reference 回收掉。
Soft Reference
如果記憶體很充足的話,物件的記憶體並不會被 GC 回收掉,當記憶體不足時,GC 會把 SoftReference 物件的記憶體清除。
使用方式:
SoftReferenceA a = new SoftReferenceA();SoftReference<SoftReferenceA> softRef = new SoftReference<SoftReferenceA>(a);System.out.println(softRef.get().id);