在执行“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? } }
零。
对象参考图如下所示:
你可以看到这个参考是循环的。 从main
到m3
引用使m3
对象保持活动状态。 反过来, m3
保持活着m1
,与m2
保持m2
。
请注意,如果将m3
设置为null
,则尽pipe每个对象都存在循环引用,但是所有这三个对象都将立即变为符合GC的条件。 GC非常聪明,可以确定所有引用都来自符合GC的对象,并收集全部三个。
可能全部3个。 //
标记之后没有引用任何variables,所以优化器在这个时候有权将它们从框架中删除。
瞧! GC将在这里收集任何东西! 让我们看看这里到底发生了什么。 当你创build了三个MyTest
的m1
, m2
和m3
对象时,这个对象就像下面一样创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)
但是,在你将m1
和m2
重新初始化为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) . . .
看,现在m1
和m2
都是null
,但是他们的参考文献仍然以m3
!
没有,因为它们仍然可以通过你通过m3
build立的循环引用到达