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

时间:2015-10-17 06:27:41

标签: java c++ garbage-collection

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

足够吗?

3 个答案:

答案 0 :(得分:3)

一旦没有对它的引用在范围内,java中的对象就有资格进行垃圾收集。

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

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

并假设head = node 1

然后是的,设置head.next = head.next.next将允许node 2在某个时候进行GC。

但是,在您的示例中,在您明确声明

之前,node2无法消失

node2 = null以及node1.next = node3,因为node2引用会将其保留在范围内。

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

答案 1 :(得分:2)

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

在你的情况下

node1.next = node3;

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

答案 2 :(得分:1)

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