java - Java 中的清除 protected 双向链表

标签 java memory-management memory-leaks garbage-collection doubly-linked-list

我目前正在为 CS 考试学习,我想到了以下问题:如果我有一个包含两个字段(一个 head-guard 和 tail-guard)的双向链表并且我想清除列表(使它是空的)。将尾节点设置为 next 就足够了吗? -我的头后面的元素,反之亦然(previous - 尾部的节点是头)。垃圾回收是否会删除这两者之间的元素(元素相互引用,但不存在从外部对该“ block ”的节点的引用?

为了更清楚一点:如果我有这个:
|HEAD| <--> |node_01| <--> | . . .| <--> |node_n| <--> |TAIL|

然后我更改了 next/previous头部和尾部的节点:
|HEAD| <--> |Tail|

Java会删除node_01 - node_n吗? (注意单箭头):
|HEAD| <-- |node_01| <--> | . . . | <--> |node_n| --> |TAIL|

它们都相互引用,但不存在来自外部的引用 - 因此我无法联系到它们。或者这是内存泄漏?

最佳答案

在您的特定示例中,GC 完全清除列表。 这是因为它们无法从图到达应用程序对象图的根对象。

在执行clear()您可以观察到每个对象也都设置为 null,这是为了防止在某些对象引用它时发生任何内存泄漏。但在你的情况下,你明确表示这不可能发生。

clear的实现供引用:

/**
 * Removes all of the elements from this list.
 */
public void clear() {
    Entry<E> e = header.next;
    while (e != header) {
        Entry<E> next = e.next;
        e.next = e.previous = null;
        e.element = null;
        e = next;
    }
    header.next = header.previous = header;
    size = 0;
modCount++;
}

关于java - Java 中的清除 protected 双向链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35113226/

相关文章:

memory-management - 为什么要在 rebol 中分配一个变量?

internet-explorer - ExtJS 和臭名昭著的内存泄漏

java - 如何向下转换 Java 对象?

java - 如何读取csv文件并在java半透明swing窗口中显示其内容?

c - 为什么 free() 在释放内存之前不将其清零?

ios - 在 iOS 上缩小图像尺寸最节省内存的方法是什么?

java - 使用 java 子串方法的内存泄漏问题

perl - 防止 Perl 中的循环引用内存泄漏

Java 将字符串拆分为 Double[ ]

java - 将 tiff 转换为缓冲图像 (Java)