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

标签 java garbage-collection

如果我有实现接口(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/

相关文章:

java - 具有 null Long 的三元表达式中的 NullPointerException

javascript - 管理离屏图像的内存

java - Spark 将数据集转换为 RDD

java - java.1.8 中是否有像 scala 中那样在 Map 中传递/存储函数引用?

java - 重复一定时间后启用按钮

python效率和内存中的大对象

java - 为什么我的对象不会死?

java - 如何在动态添加文本字段到 JPanel 后显示滚动 Pane ?

qt - 将字符串或其他非列表/树类型绑定(bind)到 qt 小部件的简单模型(mvvm 样式)

python - python对象如何存储垃圾收集的引用计数器