垃圾收集介紹

如果物件不再可由程式中的主入口點訪問,則它們有資格進行垃圾收集(GC)。GC 通常不是由使用者顯式執行的,但是為了讓 GC 知道物件不再需要,開發人員可以:

取消引用/指定 null

someFunction {
     var a = 1;
     var b = 2;
     a = null; // GC can now free the memory used for variable a
     ...
} // local variable b not dereferenced but will be subject to GC when function ends

使用弱引用

大多數使用 GC 的語言允許你建立物件的弱引用,這些引用不計入 GC 的引用。如果只有物件的弱引用而沒有強(正常)引用,則該物件符合 GC 的條件。

WeakReference wr = new WeakReference(createSomeObject());

請注意,在此程式碼之後,使用弱引用的目標而不檢查物件是否仍然存在是危險的。初學者程式設計師有時會犯這樣的程式碼錯誤:

if wr.target is not null {
    doSomeAction(wr.target);
}

這可能會導致問題,因為在 null 檢查之後和執行 doSomeAction 之前可能已呼叫 GC。最好先建立物件的(臨時)強引用,如下所示:

Object strongRef = wr.target;
if strongRef is not null {
    doSomeAction(strongRef);
}
strongRef = null;