0

我有一个双向链接的对象列表:

class MyObject {
  MyObject previousObject;
  MyObject nextObject;

  // Other fields and methods
}

只有这样一个列表的第一个对象直接存储在应用程序中,其他对象通过这个第一个对象到达并在应用程序中临时使用(但没有永久引用保留在列表本身之外)。

当一个对象不再引用时,它会被垃圾收集器收集。

但是,我想知道是否仍然如此,因为(第一个)对象仍然被链接列表中的“下一个对象”引用?那么列表的其余部分呢,这些对象是否也被收集(即使被彼此引用)?

注意:我知道当我不再使用它时,我可以删除列表中的所有引用。但由于应用程序的性质,这很“困难”,并导致额外的(不必要的?)开销。

4

3 回答 3

4

GC 不使用引用计数,因此可以很好地处理循环依赖。您无需执行任何操作,当列表中的任何元素都无法访问时,整个列表将被垃圾回收。

于 2013-02-17T11:40:31.460 回答
1

如果链接列表中的所有对象都没有连接到任何活动根,则将收集整个列表。请参阅根是什么?

于 2013-02-17T11:43:39.670 回答
1

关键点是 GC 的第一次扫描收集对所有可达对象引用。然后它会丢弃其他所有内容。通过这种方式,它可以处理循环引用和巨大的自引用结构,如树,而无需额外的工作。

显然它比这复杂得多。

不过有趣的是-在您的情况下,列表中的第一项无法访问,但此外,如果第三项可以访问,那么如果它是LinkedList前两项,则将被丢弃。但是,以前的ArrayList元素可能会保留。

于 2013-02-17T11:47:40.833 回答