【问题标题】:Java Garbage Collection with Assignment of Variables带有变量分配的 Java 垃圾收集
【发布时间】:2014-08-25 20:24:41
【问题描述】:

我浏览了 Java 网站上的 Java 教程,但对他们给出的问题的答案感到困惑。

问题如下:“下面的代码创建了一个数组和一个字符串对象。代码执行后这些对象存在多少个引用?任何一个对象都符合垃圾回收条件吗?”

String[] students = new String[10];
String studentName = "Peter Smith";
students[0] = studentName;
studentName = null;

答案:“有一个对学生数组的引用,并且该数组有一个对字符串 Peter Smith 的引用。这两个对象都不符合垃圾回收的条件。”

为什么studentName 不符合垃圾回收条件?没有任何东西指向studentName,它的值是null

【问题讨论】:

  • 对象是垃圾回收,而不是变量。

标签: java garbage-collection


【解决方案1】:

studentName 是一个 variable 而不是 object - 你只能垃圾收集对象。
如前所述,这里唯一的对象是创建的String[] 和“Peter Smith”,它们都是可访问的,因此不符合 GC 条件。

【讨论】:

    【解决方案2】:

    studentName 是对Object 的引用,而不是实际的Object

    如果你的意思是studentName引用的对象

    String studentName = "Peter Smith";
    

    那么它仍然被students[0]引用

    students[0] = studentName;
    

    【讨论】:

      【解决方案3】:

      如果您查看该站点上的文档,它会在 summary page 中说明以下内容:

      “垃圾收集器会自动清理未使用的对象。如果程序不再持有对它的引用,则该对象是未使用的。您可以通过将持有引用的变量设置为 null 来显式删除引用。”

      即使 studentName 在设置为 null 时释放了对“Peter Smith”的引用,字符串数组 students 仍然具有对该对象的引用,因此它是不符合垃圾收集条件。数组本身也仍然有对它的引用。如果你把它放在一个小程序中并运行它并在这个代码块之后打印出student[0],它将打印“Peter Smith”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-13
        • 1970-01-01
        • 2015-03-03
        • 1970-01-01
        • 1970-01-01
        • 2011-11-07
        • 2011-05-07
        相关资源
        最近更新 更多