当 Java 对象仍然与强引用和弱引用链接时,它会被 gc-ed

zhu*_*uj9 5 java reference

我这里有一个例子:

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发现没有强引用使用,所以不是强可达?

Nic*_*tar 3

由于您的循环在资源使用方面运行得相当“热”,因此 JVM 会想要对其进行优化。这样做可能会向编译器指出这样一个事实:实际上在进入循环后无法到达强引用,从而将其优化掉。

System.out.println(obj)如果您在循环后添加类似的内容,这种行为可能会改变。您可能需要调整循环条件,以便编译器看不到新语句实际上是无法访问的代码...(类似于while (weakRef.get() != null)