Java - 循环垃圾收集

时间:2010-05-10 03:39:37

标签: java

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;
        }

这应该把所有东西都作为垃圾收集的候选者发送,我希望?

2 个答案:

答案 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