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