A< - > B - < - > C - C - 。 D - < - >甲...
// A是firstNode,D是lastNode
if ( length == 1 )
{
firstNode = null;
lastNode = null;
firstNode.next = null;
firstNode.prev = null;
}
else
{
Node secondNode = firstNode.next;
Node secondToLast = lastNode.prev;
firstNode.next = null;
firstNode.prev = null;
lastNode.next = null;
lastNode.prev = null;
secondNode.prev = null;
secondToLast.next = null;
firstNode = null;
lastNode = null;
}
这应该把所有东西都作为垃圾收集的候选者发送,我希望?
答案 0 :(得分:3)
只要没有引用节点的强引用,那么节点之间是否存在循环引用并不重要,这些对象仍然是垃圾收集的候选对象
这意味着当没有更多的局部变量或静态变量来保存对象的引用时(无论它们是否超出范围,您明确地将它们设置为null
或将它们分配给其他东西)然后对象将被垃圾收集。
答案 1 :(得分:2)
Java不引用计数,因此引用是否为循环无关紧要。
Java在较高的内存密度下使用标记和扫描类型algorthim,在JVM版本1.4,1.5和1.6中使用较低密度的副本清除algorthim。标记和扫描开始从主程序线程标记所有“可到达”,并清除和压缩未标记的任何内容。复制和清除将主线程可到达的所有对象复制到新内存中,然后清除旧的内存块。
由于这两种技术都可以“从主线程中获取”技术,因此如果你制作一堆循环引用并不重要。如果引用“可从主线程到达”,则将标记并保留整个圆圈。如果主线程无法访问循环引用,则它最终将被清除,因为它未被标记为正在使用。
Java通过几代优化它的垃圾收集。有关详细信息,请查看here。
默认情况下,Java 1.7可能有新的垃圾收集策略。它被称为G1,它是Garbage First的缩写。他们一直在1.6分支中玩它,如果你愿意,你可以打开它。它比标准的垃圾收集快得多,但不清楚它是否没有错误,或者它是否会在所有重要的用例中保持更快。有关详细信息,请参阅Garbage First