垃圾收集介绍

如果对象不再可由程序中的主入口点访问,则它们有资格进行垃圾收集(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;