在执行“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 !
没有,因为它们仍然可以通过你通过m3build立的循环引用到达