执行“m1=null;m2=空;“?

2022-08-31 15:10:38

执行后,我感到困惑。有多少对象符合垃圾回收的条件?m1 = null;m2 = null;

public class MyTest {
    MyTest m;

    void show() {
        System.out.println("Hello this is show method.");
    }

    public static void main(String args[]) {
        MyTest m1 = new MyTest();
        MyTest m2 = new MyTest();
        MyTest m3 = new MyTest();
        m1.m = m2;
        m2.m = m3;
        m3.m = m1;
        m1 = null;
        m2 = null;
        // Question here: How many objects will be eligible for garbage collection?
    }
}

答案 1

零。

对象参考图如下所示:

Circular

您可以看到引用是循环的。从 的引用,以使对象保持活动状态。反过来,保持活动状态,从而防止GC。mainm3m3m3m1m2

请注意,如果设置为 ,则所有三个对象将同时符合 GC 的条件,尽管每个对象都存在循环引用。GC 足够聪明,可以确定所有引用都来自符合 GC 条件的对象,并收集所有这三个对象。m3null


答案 2

可能是所有3个。标记后不会引用任何变量,因此优化程序有权在此时将它们从帧中删除。//