Java-循环垃圾收集
A B C D A //A是第一个节点,D是最后一个节点Java-循环垃圾收集,java,Java,A B C D A //A是第一个节点,D是最后一个节点 if ( length == 1 ) { firstNode = null; lastNode = null; firstNode.next = null; firstNode.prev = null; } else { Node sec
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;
}
我希望,这会将中间的所有内容都作为垃圾收集的候选对象发送出去?只要没有引用节点的强引用,那么不管节点之间是否存在循环引用,对象仍然是垃圾收集的候选对象
这意味着当没有更多的局部变量或静态变量包含对对象的引用时,无论它们是否超出范围,您都会显式地将它们设置为null或将它们分配给其他对象,那么对象将被垃圾收集。只要没有引用节点的强引用,那么不管节点之间是否存在循环引用,对象仍然是垃圾收集的候选对象
这意味着当没有更多的局部变量或静态变量包含对对象的引用时,无论它们是否超出范围,您都可以显式地将它们设置为null或将它们分配给其他对象,然后对象将被垃圾收集。Java不引用计数,因此引用是否是循环的并不重要 在JVM版本1.4、1.5和1.6中,Java在较高的内存密度下使用标记和扫描类型的algorthim,在较低的内存密度下使用副本清除algorthim。标记和扫描开始标记从主程序线程可以到达的所有内容,并清除和压缩未标记的内容。复制和清除将主线程可访问的所有对象复制到新内存中,然后清除旧内存块 因为这两种技术都可以从主线程技术中访问,所以创建一组循环引用并不重要。如果可以从主线程访问引用,则整个圆将被标记并保留。如果主线程无法访问循环引用,那么它最终将被清除,因为它没有标记为正在使用 Java通过几代优化它的垃圾收集。有关更多详细信息,请参阅
默认情况下,Java1.7可能有一个新的垃圾收集策略。它被称为G1,是垃圾优先的缩写。他们一直在1.6分支中使用它,如果您愿意,可以打开它。它比标准的垃圾收集要快得多,但是不清楚它是否没有bug,或者在所有重要的用例中它是否会保持更快的速度。有关更多信息,请阅读关于Java不包含引用计数,因此引用是否为循环引用并不重要 在JVM版本1.4、1.5和1.6中,Java在较高的内存密度下使用标记和扫描类型的algorthim,在较低的内存密度下使用副本清除algorthim。标记和扫描开始标记从主程序线程可以到达的所有内容,并清除和压缩未标记的内容。复制和清除将主线程可访问的所有对象复制到新内存中,然后清除旧内存块 因为这两种技术都可以从主线程技术中访问,所以创建一组循环引用并不重要。如果可以从主线程访问引用,则整个圆将被标记并保留。如果主线程无法访问循环引用,那么它最终将被清除,因为它没有标记为正在使用 Java通过几代优化它的垃圾收集。有关更多详细信息,请参阅
默认情况下,Java1.7可能有一个新的垃圾收集策略。它被称为G1,是垃圾优先的缩写。他们一直在1.6分支中使用它,如果您愿意,可以打开它。它比标准的垃圾收集要快得多,但是不清楚它是否没有bug,或者在所有重要的用例中它是否会保持更快的速度。有关更多信息,请阅读节点之间可能存在强引用,例如圆形。对对象的不可访问性和可回收性的要求是:可访问对象是在任何活动线程的任何潜在连续计算中可以访问的任何对象。这符合JLS 12.6.1。JLS 12.6.1.1包含更详细的信息。我同意您的回答。我澄清了强引用的使用,并提供了文档来源:-节点之间可能存在强引用,例如循环。对对象的不可访问性和可回收性的要求是:可访问对象是在任何活动线程的任何潜在连续计算中可以访问的任何对象。这符合JLS 12.6.1。JLS 12.6.1.1包含更详细的信息。我同意您的回答。我澄清了强引用的使用,并提供了文档来源:-请参阅的可能副本请参阅的可能副本