如果某人持有它作为接口的引用,GC会收集对象吗?

时间:2013-06-12 07:14:36

标签: java garbage-collection

如果我有实现接口A的类I并将其传递到预期接口I的某个地方,例如传递给一个线程,这将阻止GC从垃圾收集类的实例A?我想是的,但是我应该怎么做呢?假设创建公共静态内部类?

4 个答案:

答案 0 :(得分:4)

对象的类型对此无关紧要。它可以是与对象,超类型或接口相同的类型。这根本不重要。

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

事实上,对象可能甚至可以直接引用它。如果它可以间接地从根上下文(GC根遍历树)到达GC,那么它仍然没有资格用于GC。如下所述。

什么是根上下文?

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

p.setChild(new Child());

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

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

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

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

答案 1 :(得分:3)

Objects有资格进行垃圾收集.. 不引用。因此,如果一个对象的全部references为{{1},则可以说该对象符合垃圾回收条件}。

答案 2 :(得分:0)

不,它不会垃圾收集实例,因为对象的引用仍然存在于线程堆栈中。

答案 3 :(得分:0)

我通过将WeakReference保持到接口实现来完成所有工作。