我有doubly linked list个对象:
class MyObject {
MyObject previousObject;
MyObject nextObject;
// Other fields and methods
}
只有这样一个列表的 first 对象直接存储在应用程序中,其他对象通过第一个对象到达并暂时在应用程序中使用(但是没有永久引用保留在列表之外本身)。
当一个人不再引用一个对象时,它会被垃圾收集器收集。
但是,我想知道是否仍然如此,因为(第一个)对象仍被链表中的“下一个对象”引用?那么列表的其余部分,那些也被收集的对象(即使被彼此引用)?
注意:我知道当我不再使用它时,我可以删除列表中的所有引用。但由于应用程序的性质,这是“困难的”,并导致额外的(不必要的?)开销。
答案 0 :(得分:4)
GC不使用引用计数,因此循环依赖关系处理得很好。你不需要做任何事情,当列表的任何元素不再可用时,整个列表将被垃圾收集。
答案 1 :(得分:1)
如果链接列表中的任何对象都没有连接到任何实时根目录,那么将收集整个列表。 见What are the roots?
答案 2 :(得分:1)
关键点是GC的第一次扫描会收集对 的所有对象的引用。然后丢弃其他所有内容。通过这种方式,它可以处理循环引用和巨大的自引用结构,如树木而无需额外的工作。
显然它要复杂得多。
有趣的是 - 在您的情况下,列表中的第一项无法访问,但另外如果第三项 可达,那么,如果它是LinkedList
,前两项将会被丢弃但是,ArrayList
- 之前的元素可能会保留。