取消引用对象但仍引用其成员对象时会发生什么?

时间:2015-01-04 12:22:32

标签: java

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;
    }
}

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

obj1 是否已准备好进行垃圾回收,即使其中一个成员对象仍被引用?

3 个答案:

答案 0 :(得分:1)

  

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

Java Garbage Collection Basics

在此上下文中,当处理obj1 = null;时,不会引用它指向的类型ClassA的对象,因此它可以用于垃圾回收。 ClassB对象mem1仍然以obj2的形式提供引用,因此至少保留到执行第obj2 = null;行。

答案 1 :(得分:0)

不再引用obj1后,它就有资格进行垃圾回收。 mem1仍然有一个引用,所以如果java此时要进行垃圾收集,obj1mem2它的点数也将被释放,但mem1将保持不变obj2仍然指向它。

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

答案 2 :(得分:0)

您有3个类实例:ClassA之一(我称之为classA_1)和ClassB中的两个(classB_1classB_2)。现在查看这3个实例中存在的所有引用路径。

obj1 = null之前它看起来很像。像这样:

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

obj1 = null看起来像这样,no ref.意味着,它有资格进行垃圾收集,因为它没有指向它的引用。

classA_1 <- no ref.
classB_1 <- classA_1.mem1 <- no ref.
classB_1 <- Sample.main.obj2
classB_2 <- classA_1.mem2 <- no ref.

唯一剩下的路径是:classB_1 <- Sample.main.obj2。没有包含对象classB_2classA_1的有效引用的路径。所以可以收集这些物品。