在执行“m1 = null;”之后有多less个对象可以进行垃圾回收。 平方米= NULL;”?

执行m1 = null;后我很困惑m1 = null; m2 = null; 。 有多less个对象有资格进行垃圾回收?

 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? } } 

零。

对象参考图如下所示:

圆

你可以看到这个参考是循环的。 从mainm3引用使m3对象保持活动状态。 反过来, m3保持活着m1 ,与m2保持m2

请注意,如果将m3设置为null ,则尽pipe每个对象都存在循环引用,但是所有这三个对象都将立即变为符合GC的条件。 GC非常聪明,可以确定所有引用都来自符合GC的对象,并收集全部三个。

可能全部3个。 //标记之后没有引用任何variables,所以优化器在这个时候有权将它们从框架中删除。

瞧! GC将在这里收集任何东西! 让我们看看这里到底发生了什么。 当你创build了三个MyTestm1m2m3对象时,这个对象就像下面一样创build(比如说对象引用id从410开始):

 m1 MyTest (id=410) m null m2 MyTest (id=412) m null m3 MyTest (id=414) m null 

初始化时

 m1.m = m2; m2.m = m3; m3.m = m1; 

对象现在看起来像:

 m1 MyTest (id=410) m MyTest (id=412) m2 MyTest (id=412) m MyTest (id=414) m3 MyTest (id=414) m MyTest (id=410) m MyTest (id=412) m MyTest (id=414) m MyTest (id=410) . . . (This is circular) 

但是,在你将m1m2重新初始化为null ,这些对象看起来像:

 m1 null m2 null m3 MyTest (id=414) m MyTest (id=410) m MyTest (id=412) m MyTest (id=414) m MyTest (id=410) . . . 

看,现在m1m2都是null ,但是他们的参考文献仍然以m3

没有,因为它们仍然可以通过你通过m3build立的循环引用到达