繁体   English   中英

队列dequeue()示例代码中的Java垃圾回收

[英]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;
}

在这里, firstlast可以理解为分别指向队列中的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指向Afirst.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM