gpt4 book ai didi

java - 递归地使 Java 中的成员对象无效?

转载 作者:行者123 更新时间:2023-11-29 06:37:12 26 4
gpt4 key购买 nike

作为另一个对象的成员的对象是否在父对象符合垃圾收集条件时变得符合垃圾收集条件?例如,让我们想象一下这个场景:

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

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

好的,现在我们开始(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;

当然,此时 object_1 是 Garbage Collectable,但是 object_2object_3 呢?我是否必须这样做以避免内存泄漏?

object_1.getMyClass_2().setMyClass_3(null);
object_1.setMyClass_2(null);
object_1 = null;

或者 JVM 会自动执行该引用发布吗?如果需要手动执行,我可以依赖 finalize() 吗?

最佳答案

这是孤立岛的典型例子。

是的.. 所有标记为 null 的对象以及对象岛(对象相互引用);但它们都不可达)收集垃圾。

"Island of isolation" of Garbage Collection 上查看这篇不错的帖子

并且在这种情况下,您不需要显式地将 My_class2 和 My_class3 设置为 null。一旦 parent 为 null,GC 也会回收它们。

Finalize 不是一种进行垃圾收集的方法。当那个类的对象被垃圾回收时,finalize 基本上给了你一个做某事的机会。但甚至不要依赖 finalize 方法进行任何清理,因为一个对象可能永远不会被垃圾收集,因此永远不会调用 finalize。

查看有关 finalize 的更多信息 When is the finalize() method called in Java?

关于java - 递归地使 Java 中的成员对象无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18793014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com