当我在学习LinkedList的数据结构,这个问题就会出现。 假设每个链路 (或节点)是由包含两个字段, 数据及下一个指向下一个链路的对象表示。 如果我想删除一个特定节点,显然我会更新以前的链接的下一个领域。 但要我把删除的链接的下一个字段设置为null,以确保它会被垃圾收集器回收?
如果我的描述是不明确的,我试着概括(或简化)我的问题。 假设一个对象物A1具有一个字段,它引用另一个对象A2相同的类的类A的。 如果没有引用到对象A1,它会被垃圾收集器? 或者,我们必须明确地设定基准场A1为空 ? (不关心对象A2,还有除了在A1的基准场它的其他引用)。
垃圾收集器收集的理想所有对象,这是不通过程序流程到达。 即使这个对象必须在JVM一切引用。
如果程序的所有正在运行的线程不包含它的任何直接或间接的引用对象变得不可访问。
直接引用如下:
void main(String... args){
Object a = new Object(); // <- from here main thread of program
// has reference to object `a`
...
}
间接引用如下所示:
void main(String... args){
List b = new ArrayList();
b.add(new Object()); // <- here you can't access object by typing `a`
// as in previous example, but you can get access with `b.get(0);`
// so that object can be accessed indirectly -> it is reachable.
}
它也处理对象的大岛屿,其中有相互引用的正常情况,但程序流程再没有任何一个到达。
MyClass a = new MyClass();
MyClass b = new MyClass();
a.field = b;
b.field = a;
// at this point a and b are reachable so they cannot be collected
b = null;
// at this point b's object is reachable indirectly through `a.field`
// so neither a nor b can be collected
a = null;
// at this point you cannot reach neither a nor b
// so a and b can be garbage collected,
// despite the fact that a is referenced by b and vice versa
UPD:添加例子,改变了一些话来回答更加清晰。
你的对象A1可以被收集,即使它的场仍然引用其他对象。 你并不需要设置其字段设置为null。
垃圾收集器收集哪些是不可达的对象。 一个对象可以持他人引用,但仍然可以收集。 一个对象可能有引用它,从其它非可到达对象,并且仍然被收集。
所有孤儿对象是垃圾收集自动有资格。 而你并不需要explicitility设置参考空(但它是一个很好的编码习惯)。
当垃圾收集器运行,它会看到,现在a1
需要被垃圾回收,因为有它不再引用。
它也将除去在参考场a1
指向的对象a2
但仍然a2
(如你所提到的a2
有除了在A1的基准场它的其他引用 ),所以它不符合垃圾收集,因此它仍然存在。
文章来源: Will Java garbage collector reclaim non-referenced object which contains reference to other objects