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

标签 java garbage-collection

我在算法类(class)中浏览了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 可以理解,分别指向队列中的第一个和最后一个元素。我对作者使用的 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 赋值消除它的最后一个 Activity 引用(一旦 dequeue 退出),因此垃圾收集器将不会跟踪它的任何引用。

关于Queue dequeue()示例代码中的Java垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16653158/

相关文章:

java - 从对象的 ArrayList 创建 JTable - Java

c# - .NetFramework 4.8 和 .Net 5 之间的垃圾收集行为差异

java - XML Pull Parser 和 SAX Parser 有什么区别

memory-management - 将指针设置为 nil 以防止 Golang 中的内存泄漏

java - maven:能够执行 "post-integration-test"的 Sonar 目标但不能执行 "site"阶段

java - 如何使用java程序执行flume配置文件?

java - 尽管我们的基准程序每秒创建数百万个对象,但日志中报告的垃圾收集很少

java - 为什么java中的finalize()方法不在Finalizer类中?为什么它被定义在对象类中?

Java Eclipse - 如何更改类路径?

java - 有没有办法使用 liquibase 截断所有表?