Java 当对象被取消引用但其成员对象仍被引用时会发生什么情况?

Java 当对象被取消引用但其成员对象仍被引用时会发生什么情况?,java,Java,在上面的程序中,在以下行之后会发生什么:obj1=null obj1是否准备好进行垃圾收集,即使其成员对象之一仍在被引用 自动垃圾收集是查看堆内存的过程,识别哪些对象正在使用,哪些未使用,并删除未使用的对象。正在使用的对象或引用的对象表示程序的某些部分仍然保持指向该对象的指针。程序的任何部分都不再引用未使用的对象或未引用的对象。因此,可以回收未引用对象使用的内存 在这种情况下,当obj1=null已处理。没有对它所指向的ClassA类型的对象的引用,因此它可用于垃圾收集。然而,ClassB对象

在上面的程序中,在以下行之后会发生什么:
obj1=null

obj1是否准备好进行垃圾收集,即使其成员对象之一仍在被引用

自动垃圾收集是查看堆内存的过程,识别哪些对象正在使用,哪些未使用,并删除未使用的对象。正在使用的对象或引用的对象表示程序的某些部分仍然保持指向该对象的指针。程序的任何部分都不再引用未使用的对象或未引用的对象。因此,可以回收未引用对象使用的内存


在这种情况下,当
obj1=null已处理。没有对它所指向的
ClassA
类型的对象的引用,因此它可用于垃圾收集。然而,
ClassB
对象,
mem1
仍然有一个形式为
obj2
的引用,因此至少保留到行
obj2=null

在不再引用
obj1
后,它将符合垃圾收集的条件
mem1
仍然有一个引用,因此如果java在此时进行垃圾收集,
obj1
mem2
也会被释放,但是
mem1
将保持不变,因为
obj2
仍然指向它


当然,在
obj2=null
之后,它也可以被收集。

您有3个类的实例:一个是
ClassA
(我称之为
ClassA\u 1
),两个是
ClassB
ClassB\u 1
ClassB\u 2
)。现在看看这3个实例的所有引用路径

obj1=null
之前,它看起来是smth。像这样:

class ClassA {
    ClassB mem1 = new ClassB();
    ClassB mem2 = new ClassB();
}

class ClassB {
}

public class Sample {
    public static void main(String[] args) {
        ClassA obj1 = new ClassA();
        ClassB obj2 = obj1.mem1;

        obj1 = null;

        obj2 = null;
    }
}

剩下的唯一路径是:
classB_1它们不再可访问。它符合GC的条件。obj1的可能副本已准备好进行GC,但obj2通过main中的第二个引用保持活动状态。
obj1
可以进行GC'd-但是
obj2==mem1
不能进行GC'd。Java只是一个大的参考图——您可以删除图的一部分,但节点可以在其他地方引用。可以将其视为从根节点(天花板)通过引用(字符串)悬挂的权重。当您
null
引用时,您剪断字符串。如果没有更多的绳子支撑重物,那么重物就会落到地板上(GC)。
classA_1 <- Sample.main.obj1
classB_1 <- classA_1.mem1 <- Sample.main.obj1
classB_1 <- Sample.main.obj2
classB_2 <- classA_1.mem2 <- Sample.main.obj1
classA_1 <- no ref.
classB_1 <- classA_1.mem1 <- no ref.
classB_1 <- Sample.main.obj2
classB_2 <- classA_1.mem2 <- no ref.