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_2和object_3?我是否应该这样做以避免内存泄漏?
object_1.getMyClass_2().setMyClass_3(null);
object_1.setMyClass_2(null);
object_1 = null;
Run Code Online (Sandbox Code Playgroud)
或者JVM是否自动执行该引用版本?如果需要手动完成,我可以依靠finalize()来达到此目的吗?
这是隔离岛的典型例子.
是..所有标记为null的对象以及对象岛(彼此指向的对象); 但是没有一个可以到达)垃圾收集.
在垃圾收集的"隔离岛"上看到这篇不错的帖子
在这种情况下,您不需要将My_class2和My_class3显式设置为null.一旦父项为空,GC也将回收它们.
Finalize不是垃圾收集的一种方式.基本上,finalize让你有机会做什么,当该类的对象被垃圾收集时.但即使不依赖于finalize方法进行任何清理,因为对象永远不会被垃圾收集,因此永远不会调用finalize.
查看有关finalize的更多信息何时在Java中调用finalize()方法?