java - Java 中是否有类似于 C++ 的删除函数,以便将项目设置为 null 提示 GC?

标签 java garbage-collection copy variable-assignment

当创建我自己的单链表类时,我注意到推送和弹出功能似乎按预期工作。尽管在 pop_back() 方法中我设置了 headTmp = null 以指示不再需要此操作。另外,由于 tmp 已分配给 headTmp.data,因此这可能会搞砸对 tmp 的分配吗?此分配是 headTmp.data 的副本还是引用分配?我不确定 Java 是否会复制函数参数之外的内容。

在 C++ 中,赋值是一个副本,然后我将有一个指针并删除 headTmp 项。我是否需要在此代码中使用 headTmp = null ,还是这没有任何帮助或可能损害数据的分配,而只是设置 prev.next = null 就足够了GC 会处理这个清理工作吗?我是否应该考虑类似于 C++ 中的共享指针的垃圾收集,其中使用引用计数,以便当没有任何东西指向该对象时它会被清理?我习惯自己清理垃圾

package dynamiclist;

public class LinkedList<T>
{
    public T pop_back()
    {
        Node<T> prev = null;
        Node<T> headTmp = head;

        while ( headTmp.next != null)
        {
            prev = headTmp;
            headTmp  = headTmp.next;
        }

        T tmp = headTmp.data;
        headTmp = null;  // does this help in GC at all? Does it effect previous assignment of tmp?

        prev.next = null;
        return tmp;
    }

    public void push_back(T t)
    {
        if (head == null)
        {
            head = new Node<T>(t);
            return;
        }

        Node<T> headTmp = head;
        while (headTmp.next != null)
        {
            headTmp= headTmp.next;
        }

        headTmp.next = new Node<T>(t);
        headTmp.next.next=null;
    }

    public void printList()
    {
        Node<T> headTmp = head;
        while ( headTmp!=null)
        {
            headTmp.printNode();
            headTmp = headTmp.next;
        }
        System.out.println();
    }

    private Node<T> head;
}

最佳答案

您不需要将其设置为null。一旦引用被破坏(没有更多实例引用该对象),垃圾收集器就会自动清理它。

尽管将某些内容设置为 null 并不是一件坏事(基本上省略了前一个链接),但这并不能保证该对象将被清理。如果某个其他实例仍在引用该指针,则垃圾收集器将不会清除它,直到引用原始对象的所有实例都忽略了它们的关系。

长话短说,没有必要,但不会造成伤害。

作为 http://javarevisited.blogspot.nl/2011/04/garbage-collection-in-java.html 的简短引用:

  1. 作为 Java 程序员,你不能在 Java 中强制进行垃圾回收;仅当 JVM 认为需要基于 Java 堆大小的垃圾回收时才会触发。

如果将 null 分配给某个对象,则将忽略它的链接。这是在作用域结束时自动完成的。由于垃圾收集器仅在 Java 需要内存时运行,因此它几乎没有用处。

还有一个简短的旁注(如果您习惯使用 C++):

Java 将所有对象和数组作为指针处理。如果您想复制它们,则必须深度复制它们。

关于java - Java 中是否有类似于 C++ 的删除函数,以便将项目设置为 null 提示 GC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18114592/

相关文章:

python脚本将目录中的所有文件连接成一个文件

java - 无法执行目标 org.springframework.boot :spring-boot-maven-plugin:2. 2.5.RELEASE:run (default-cli)

java - BoxLayout 对strut的误解

java - Apache Ignite Jdbc 连接用于单机上 2 个独立的数据网格

javascript - 将字段内容复制到其下方所有动态生成的类型字段

file - 将文件名中具有特定字符串的目录中的所有文件复制到 Bash 中的不同目录

java - 如何让一排按钮处于固定位置?

python - Python 中的垃圾回收如何与类方法一起工作?

java - 如何在 Java GC 中使旧区域自适应调整大小?

java - 垃圾收集器对象的内存泄漏