如何为LinkedList自动垃圾收集工作

Java - How does automatic garbage collection work for LinkedList?

本文关键字:工作 LinkedList      更新时间:2023-10-16

在c++中,你需要手动删除LinkedList中的节点:

  Node* node1 = new Node(s);
  Node* node2 = new Node(s);
  Node* node3 = new Node(s);
  node1 -> next = node2;
  node2 -> next = node3;
  //remove node2 by: 
  delete node2;
  node1 -> next = node3;

对于Java(这是我第一天学习它)如何自动垃圾回收知道什么时候采取行动?会:

    node1.next = node3;

是足够的吗?

一旦java中的对象在作用域内没有引用,它就有资格被垃圾收集。

如果你有一个像这样的单链表

(1) -> (2) -> (3)

假设head = node 1

那么是的,设置head.next = head.next.next将允许node 2在某个时刻被GC。

然而,在您的示例中,node2不能消失,直到您显式声明

node2 = nullnode1.next = node3,因为作为node2的引用将使其保持在作用域中。

注意,node2 = null实际上并没有对node2曾经指向的Node对象做任何事情。相反,它只是将引用(因为java中的所有对象实际上都是指针)设置为null。

Java垃圾收集器定期遍历整个对象引用映射,以查找和删除未引用或循环引用的对象。您可以提示JVM开始垃圾收集的迭代,但是您无法实际地指示JVM确定地进行垃圾收集。

在你的情况下

node1.next = node3;

就足够了,因为node2将不再有任何对象引用它

假设您修改了LinkedList,使得不再有对node2的引用,那么垃圾收集器可以释放它的内存。换句话说,假设没有其他对node2的引用,node1.next = node3;应该足够了。