Reference

James Lin
2 min readOct 20, 2018

--

首先先看到這張圖

當我們 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);

--

--

James Lin
James Lin

No responses yet