Java - LinkedList 的自动垃圾回收是如何工作的?
Java - How does automatic garbage collection work for LinkedList?
在 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;
够用吗?
假设您以某种方式修改 LinkedList
,使得不再有对 node2
的引用,垃圾收集器可以释放其内存。换句话说,node1.next = node3;
应该足够了,假设没有其他引用 node2
.
java 中的对象一旦在范围内没有对它的引用,将有资格进行垃圾回收。
所以如果你有一个像这样的单向链表
(1) -> (2) -> (3)
并假设 head = node 1
那么是的,设置 head.next = head.next.next
将允许 node 2
在某个时候被 GC。
但是,在您的示例中,您的 node2
在您明确声明
之前不会消失
node2 = null
除了 node1.next = node3
因为作为 node2
的引用将保持它在范围内。
请注意,node2 = null
实际上并未对 node2
过去指向的 Node
对象执行任何操作。相反,它只是将引用(因为 java 中的所有对象实际上都是指针)设置为 null。
Java 垃圾收集器定期遍历整个对象引用映射以查找和删除未引用或循环引用的对象。您可以提示 JVM 开始垃圾收集的迭代,但是您无法务实地指示 JVM 确定性地进行垃圾收集。
你的情况
node1.next = node3;
就足够了,因为 node2
将不再有任何对象引用它
在 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;
够用吗?
假设您以某种方式修改 LinkedList
,使得不再有对 node2
的引用,垃圾收集器可以释放其内存。换句话说,node1.next = node3;
应该足够了,假设没有其他引用 node2
.
java 中的对象一旦在范围内没有对它的引用,将有资格进行垃圾回收。
所以如果你有一个像这样的单向链表
(1) -> (2) -> (3)
并假设 head = node 1
那么是的,设置 head.next = head.next.next
将允许 node 2
在某个时候被 GC。
但是,在您的示例中,您的 node2
在您明确声明
node2 = null
除了 node1.next = node3
因为作为 node2
的引用将保持它在范围内。
请注意,node2 = null
实际上并未对 node2
过去指向的 Node
对象执行任何操作。相反,它只是将引用(因为 java 中的所有对象实际上都是指针)设置为 null。
Java 垃圾收集器定期遍历整个对象引用映射以查找和删除未引用或循环引用的对象。您可以提示 JVM 开始垃圾收集的迭代,但是您无法务实地指示 JVM 确定性地进行垃圾收集。
你的情况
node1.next = node3;
就足够了,因为 node2
将不再有任何对象引用它