即使根线程引用了其子对象之一,也无法从GC根线程访问的父对象对于Java GC是可省略的吗?

即使根线程引用了其子对象之一,也无法从GC根线程访问的父对象对于Java GC是可省略的吗?,java,garbage-collection,java-11,Java,Garbage Collection,Java 11,假设我们有以下几节课 public class Parent { public Child child; public Parent(Child child) { this.child = child; } } public class Child { public String someField; } 我们的主程序中有以下代码 Parent parent = new Parent(new Child()); Child child = parent.ch

假设我们有以下几节课

public class Parent {
  
  public Child child;

  public Parent(Child child) {
    this.child = child;
  }
}

public class Child {

  public String someField;
}
我们的主程序中有以下代码

Parent parent = new Parent(new Child());
Child child = parent.child;
parent = null;
// then do other stuff

将父级设置为null后,即使它的一个内部字段/子级被主根线程直接引用,它也可以进行垃圾收集吗?

是,它将符合GC条件,因为
子级
没有对
父级的引用,当父对象的变量设置为null时,不保留对父对象的引用。注意:这可以通过调用System.gc()进行演示(出于测试目的),并重写父级和子级中的finalize()方法。当JVM确定对象已准备好进行GC时,将在该对象上调用该方法。

子对象
将不可省略,因为root用户直接引用它,对吗?@Jeep87c确实可以。顺便说一句,您可以通过调用
System.gc()
(不要在生产中这样做),并覆盖
Parent
Child
中的
finalize()
方法来验证这一点。当JVM确定它已准备好进行GC时,将调用该方法。