在Java中递归地取消成员对象?

1 java null memory-leaks member recursive-datastructures

当父对象执行时,作为另一个对象的成员的对象是否有资格进行垃圾收集?例如,让我们想象一下这种情况:

MyClass_1的代码:

public class MyClass_1 {

    // Member object
    private MyClass_2 myClass_2;

    // Getter
    public MyClass_2 getMyClass_2() {
        return this.myClass_2;
    }

    // Setter
    public void setMyClass_2(MyClass_2 myClass_2) {
        this.myClass_2 = myClass_2;
    }
}
Run Code Online (Sandbox Code Playgroud)

MyClass_2的代码:

public class MyClass_2 {

    // Member object
    private MyClass_3 myClass_3;

    // Getter
    public MyClass_3 getMyClass_3() {
        return this.myClass_3;
    }

    // Setter
    public void setMyClass_3(MyClass_3 myClass_3) {
        this.myClass_3 = myClass_3;
    }
}
Run Code Online (Sandbox Code Playgroud)

好的,现在我们做(MyClass_3的代码不相关):

// Instantiation of one root object
MyClass_1 object_1 = new MyClass_1();

// Composition of two more objects
object_1.setMyClass_2(new MyClass_2());
object_1.getMyClass_2().setMyClass_3(new MyClass_3());

// And now...
object_1 = null;
Run Code Online (Sandbox Code Playgroud)

当然,在这一点上object_1是当作垃圾收集,但对于object_2object_3?我是否应该这样做以避免内存泄漏?

object_1.getMyClass_2().setMyClass_3(null);
object_1.setMyClass_2(null);
object_1 = null;
Run Code Online (Sandbox Code Playgroud)

或者JVM是否自动执行该引用版本?如果需要手动完成,我可以依靠finalize()来达到此目的吗?

Gya*_*edi 5

这是隔离岛的典型例子.

是..所有标记为null的对象以及对象岛(彼此指向的对象); 但是没有一个可以到达)垃圾收集.

垃圾收集的"隔离岛"上看到这篇不错的帖子

在这种情况下,您不需要将My_class2和My_class3显式设置为null.一旦父项为空,GC也将回收它们.

Finalize不是垃圾收集的一种方式.基本上,finalize让你有机会做什么,当该类的对象被垃圾收集时.但即使不依赖于finalize方法进行任何清理,因为对象永远不会被垃圾收集,因此永远不会调用finalize.

查看有关finalize的更多信息何时在Java中调用finalize()方法?