首页 > 解决方案 > 即使根线程引用了其子对象之一,GC 根线程不再可以访问父对象是否符合 Java 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 后,父项是否有资格进行垃圾收集?

标签: javagarbage-collectionjava-11

解决方案


是的,它将有资格进行 GC,因为Child没有对 的引用,当其变量设置为 null 时Parent,不会留下对对象的引用。Parent注意:这可以通过调用 System.gc() 来演示(用于测试目的),并覆盖 Parent 和 Child 中的 finalize() 方法。当 JVM 确定它已准备好进行 GC 时,将对对象调用该方法。


推荐阅读