gpt4 book ai didi

java - 垃圾收集 - 孤立的 LinkedList 链接

转载 作者:搜寻专家 更新时间:2023-10-30 21:07:50 24 4
gpt4 key购买 nike

假设您有引用 A -> B -> C -> D。当您从 A 中删除对 B 的引用时,您会留下对象 B -> C -> D 的孤立链。

CD 是否会被垃圾收集,即使无法访问它们(因为没有对 B 的引用)?

我想 GC 对此很聪明,会解决任何此类依赖关系。

但是,我查看了 source code对于 LinkedList 类,发现了一些与这种信念相反的东西。我注意到当列表被 clear() 编辑时,对每个链接的所有引用都被显式设置为 null,从而使其成为 O(n) 操作。这样做有什么理由/好处吗?

最佳答案

这看起来确实有点奇怪。也许它明确拆除列表的原因是为了清除现有迭代器和子列表以及父列表的列表。

当然不是为了加快垃圾收集速度。垃圾收集器不会遍历无法访问的对象中的引用,因此将它们置空不会产生任何影响。

更新

该方法的较新版本具有以下注释:

// Clearing all of the links between nodes is "unnecessary", but:
// - helps a generational GC if the discarded nodes inhabit
// more than one generation
// - is sure to free memory even if there is a reachable Iterator

因此,GC 似乎是有好处的,至少在某些情况下是这样。

假设老一代中的 Node 包含对年轻一代中对象(例如 Node 或元素)的引用。当收集年轻一代时,该引用成为“根”,导致年轻一代对象被保留,即使老一代 Node 不可达。这种状态一直持续到老一代被收集为止。不经常收集老年代。

如果遍历列表并将其拆解,包含旧 -> 新引用的变量将被分配一个 null。该分配的写屏障导致(立即或在 GC 时间)原始引用不再是“根”。因此,现在可以收集年轻一代中的对象,并且它不会最终“永久”到老一代(这提前了老一代需要收集的时间)。

据推测,GC 的好处超过了取消选择列表的成本......无论是平均而言,还是在成本是灾难性的情况下。

有关详细信息,请参阅 Jones 和 Lins 的“用于动态内存管理的垃圾收集算法”。它在我的(第一版)副本的第 7.5 章中。


一般来说,扔掉一个Collection对象并重新开始比清除它以供重用更好。

关于java - 垃圾收集 - 孤立的 LinkedList 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6935579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com