即使其子对象之一被根线程引用,GC 根线程不能再访问的父对象是否符合 Java GC 的条件?
Will a parent object no more accessible from a GC root thread be elligible for Java GC even if one of its child is referenced by the root thread?
假设我们有以下 类
public class Parent {
public Child child;
public Parent(Child child) {
this.child = child;
}
}
public class Child {
public String someField;
}
我们的 main
中有以下代码
Parent parent = new Parent(new Child());
Child child = parent.child;
parent = null;
// then do other stuff
即使主根线程直接引用其内部字段/子项之一,父项在将其设置为 null 后是否有资格进行垃圾回收?
是的,它将有资格进行 GC,因为 Child
没有对 Parent
的引用,当它的变量设置为 null 时,没有留下对 Parent
对象的引用。注意:这可以通过调用 System.gc()(用于测试目的)并覆盖父子中的 finalize() 方法来演示。当 JVM 确定对象已准备好进行 GC 时,将在对象上调用该方法。
假设我们有以下 类
public class Parent {
public Child child;
public Parent(Child child) {
this.child = child;
}
}
public class Child {
public String someField;
}
我们的 main
中有以下代码Parent parent = new Parent(new Child());
Child child = parent.child;
parent = null;
// then do other stuff
即使主根线程直接引用其内部字段/子项之一,父项在将其设置为 null 后是否有资格进行垃圾回收?
是的,它将有资格进行 GC,因为 Child
没有对 Parent
的引用,当它的变量设置为 null 时,没有留下对 Parent
对象的引用。注意:这可以通过调用 System.gc()(用于测试目的)并覆盖父子中的 finalize() 方法来演示。当 JVM 确定对象已准备好进行 GC 时,将在对象上调用该方法。