[英]Java garbage collection in Queue dequeue() sample code
我正在算法课程中浏览Queue实现的代码,并观察了作者使用的dequeue()代码:
private Node first, last;
private class Node {
String item;
Node next;
}
public boolean isEmpty() {
return first == null;
}
// Code segment in doubt
public String dequeue() {
String item = first.item;
first = first.next;
if (isEmpty()) last = null;
return item;
}
在这里, first和last可以理解为分别指向队列中的first和last元素。 我对作者使用的dequeue()中的代码有些怀疑。 因为,他只是在做:
first = first.next;
而不将first.next分配给null 。 是否会留下悬挂参考(或闲逛),这会妨碍JVM的垃圾回收机制? 我有点困惑, dequeue()的代码应该看起来像这样吗? (我确定在C / C ++中代码应类似于以下内容,但想知道在这种情况下JAVA的预期行为)
public String dequeue() {
Node old;
old = first;
first = first.next;
old.next = null;
if (isEmpty()) last = null;
return old.item;
}
如果有人可以向我提供参考该资源的详细示例,我将不胜感激。
设置old.next = null
是不必要的,因为old
已准备好进行垃圾收集( first = first.next
分配消除了其最后一个活动引用(一旦dequeue
退出)),因此垃圾收集器不会跟踪其任何引用。 。
假设您在队列中有2个对象:A和B
first
指向A
, first.next
指向B
(换句话说A.next == B
)
对A
的唯一引用是Queue#first
变量。 当你做
first = first.next; // first == B
没有人引用A
对象了,所以它是符合垃圾回收。
如果您的队列未实现为Doubly Queue
(意味着您可以访问队列中的.Next和.Prev),则在将first
设置为first.next
,将没有引用或指针指向first
,然后是垃圾回收线程将知道( first
)需要对其进行垃圾收集(相关的内存将被释放)。
仅来自活动对象的引用很重要。 这些决定了哪些对象是活动的。
如果某个对象具有对活动对象的引用,但未引用该对象,则将收集该对象。 (JVM不使用引用计数,因此无需更新此计数)
另一个与人有关的情况是,如果两个对象相互引用(但没有其他作用),这再次很好,因为仅保留了可以从根节点(例如线程)访问的对象,并收集了所有其他对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.