我这里有一个例子:
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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
运行这个程序时,我们会"The object has been collected."在一段时间后得到输出,这意味着对象将被 gc-ed。
但是,仍然存在一个名为"obj"链接到对象的强引用,如何回收?因为后来JVM发现没有强引用使用,所以不是强可达?
由于您的循环在资源使用方面运行得相当“热”,因此 JVM 会想要对其进行优化。这样做可能会向编译器指出这样一个事实:实际上在进入循环后无法到达强引用,从而将其优化掉。
System.out.println(obj)如果您在循环后添加类似的内容,这种行为可能会改变。您可能需要调整循环条件,以便编译器看不到新语句实际上是无法访问的代码...(类似于while (weakRef.get() != null))