2013-04-02 77 views
0

当我学习LinkedList的数据结构,这个问题就会出现。假设每个链接(或节点)由包含两个字段的对象表示,数据 & 下一个指向下一个链接。如果我想删除一个特定的节点,显然我会更新之前链接的下一个字段。但是,我是否应该将已删除的链接的下一个字段设置为空,以确保它将被垃圾收集器回收?威尔Java垃圾收集回收非引用的对象包含引用到其他对象

如果我的描述不清楚,我尝试概括(或简化)我的问题。假设对象a1A它有一个领域,其中引用另一个对象a2同一类。如果没有提及对象a1,它是否有资格使用垃圾收集器?或者,我们必须明确地设定基准场A1? (不关心对象a2,除a1中的参考字段外还有其他参考。

回答

4

垃圾收集器理想地收集所有对象,这是程序流无法访问的。即使此对象具有对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:增加了例子,改了一些词让答案更清晰。

0

所有孤儿对象都自动符合垃圾回收的条件。而且你不需要将显式设置为空引用(但是这是一个很好的编码习惯)。

0

当垃圾收集器运行,它会看到,现在a1需要进行垃圾回收,因为有它不再引用。

它也将删除引用领域a1指向的a2

,但仍反对对a2(如你所提到的a2有它除了参考场A1其他参考资料),所以它没有资格收集垃圾,因此它仍然存在。

1

即使您的对象的字段仍然引用其他对象,也可以收集对象a1。您不需要将其字段设置为空。

垃圾收集器收集的对象不是可达。一个对象可以持有对他人的引用并仍然被收集。一个对象可能有其他不可达对象的引用,并且仍然被收集。