即使其子对象之一被根线程引用,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 时,将在对象上调用该方法。