gpt4 book ai didi

java - 如果有人将对象的引用作为接口(interface)持有,GC 会收集对象吗?

转载 作者:行者123 更新时间:2023-11-29 06:38:10 27 4
gpt4 key购买 nike

如果我有实现接口(interface) I 的类 A 并将它传递到需要接口(interface) I 的地方,例如传递给线程,将这会阻止 GC 对 A 类的实例进行垃圾回收?我想是的,但我该如何解决呢?假设创建公共(public)静态内部类?

最佳答案

对象引用的类型在这里并不重要。它可以是与对象相同的类型、它的父类(super class)型或接口(interface)。一点都不重要。

重要的是对象是否可以从根上下文 访问。直到一个对象有一个对它的有效引用(不管它的引用类型)它不会被垃圾收集

事实上,对象可能没有甚至直接引用它。如果它可以从根上下文间接访问(从 GC 根遍历树),它仍然不符合 GC 的条件,如下所述。

什么是根上下文?

您的程序在根目录下创建的所有对象,即直接像 Parent p = new Parent(); 一样称为 GC Roots,它们共同构成了根上下文。没有一个 GC Roots 有资格进行垃圾收集。现在,如果您创建一个新的 Child 对象,例如

p.setChild(new Child());

然后 Child 对象(虽然不是 GC Root)可以通过 Parent p 从根上下文访问,因此不符合垃圾收集条件。现在,如果您将当前的 child 替换为

p.setChild(new Child()); // old child replaced

旧的子对象变成了孤儿(不再可以从根上下文访问),因此会被垃圾收集。因此,您可以看到引用类型与对象的垃圾回收无关。

并且,为了完成这个主题:孤立对象的岛屿(尽管它们可能相互引用)仍然会收集垃圾,因为它们无法从根上下文访问。

关于java - 如果有人将对象的引用作为接口(interface)持有,GC 会收集对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17059690/

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