【问题标题】:Deleting a single linked list by just making head = null?仅通过设置 head = null 来删除单个链表?
【发布时间】:2015-06-26 09:42:27
【问题描述】:

为什么我不能让head=null 删除完整的链接列表?

3 = head > 1 > 2 > 4 > null

通过head = null,JVM会处理它。由于头节点没有被任何变量引用,它应该被垃圾回收。

这个解决方案有什么问题?

注意:我知道删除完整链接列表的正确解决方案,但我很好奇为什么我不能让head=null 删除完整链接列表?

【问题讨论】:

  • 你可以。没问题。
  • 谁告诉你 GC 不像你想象的那样工作?
  • 如果列表中的一个项目被代码中的其他地方引用或使用本机资源怎么办?
  • 我想java.util.LinkedList.clear() 这样做。
  • @igreen - 实际上我的想法是一样的,即使我设置了 head=null,但是 head.next 被某个变量引用,那么即使在设置了 head=null 之后,headnodes 之后的节点也会获胜不会被垃圾收集。但我不确定

标签: java data-structures linked-list garbage-collection


【解决方案1】:

这里是java.util.LinkedList.clear()的代码,逐字逐句:

public void clear() {
    // 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
    for (Node<E> x = first; x != null; ) {
        Node<E> next = x.next;
        x.item = null;
        x.next = null;
        x.prev = null;
        x = next;
    }
    first = last = null;
    size = 0;
    modCount++;
}

评论回答了您的问题。这是不必要的。但是它可以帮助 GC,如果有一个 Iterator 引用其中一个节点,它可以让更多的对象更快地符合 GC 条件:被引用的节点仍然不符合 GC 的条件,但是被引用的节点之前和之前的所有节点节点将是,因为它们不再被引用。

请注意,开发人员选择使 clear() 方法更慢(O(n) 而不是 O(1)),以使 GC 更快并减少“内存泄漏”。你可以做相反的选择。

还请注意,您可能永远不会调用 clear(),而只是停止引用 LinkedList 类型的对象,而将所有节点链接在一起。如果无法通过 GC 根的引用链访问所有节点,则 GC 将收集所有节点。这就是您使用列表的 99% 的情况。

【讨论】:

  • 如果我们将 head 更改为第二个项目(删除第一个项目),在我们删除它指向第二个项目的指针之前,第一个项目不会被垃圾收集吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 2020-11-17
  • 2021-12-18
相关资源
最近更新 更多