【发布时间】:2019-12-11 06:49:57
【问题描述】:
这里有一个例子:
import java.lang.ref.WeakReference;
public class WeakRefTest {
public static void main(String[] args) {
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<Object>(obj);
int i = 0;
while (true) {
if (weakRef.get() != null) {
i++;
System.out.println("The object is alive for " + i + " loops - " + weakRef);
} else {
System.out.println("The object has been collected.");
break;
}
}
}
}
当运行这个程序时,我们会在一段时间后得到"The object has been collected."的输出,这意味着对象将被gc-ed。
但是,仍然有一个名为"obj" 的强引用链接到该对象,如何回收它?因为JVM后来发现没有强引用使用,所以不强可达?
【问题讨论】:
-
但是,仍然有一个名为“obj”的强引用链接到该对象你到底是什么意思?究竟是谁在阻止
Object被收集? -
@Eugene 为什么要重新打开? Stuart Marks 的回答解释说,
obj可以被收集,因为程序中没有任何内容,在它被用于初始化WeakReference之后,使用它。即使堆栈上有对它的“强引用”,它也不能“在任何活动线程的任何潜在持续计算中访问”,因此可以被收集。副本没有解决WeakReference,但这与程序的行为无关,它是Object的集合。