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