【问题标题】:Why this String is not eligible for garbage collection?为什么这个字符串不符合垃圾回收条件?
【发布时间】:2016-09-08 06:52:06
【问题描述】:

以下代码创建一个数组和一个字符串对象。代码执行后存在多少对这些对象的引用?任一对象都符合垃圾回收条件吗?

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

我的回答是 studentName 有资格进行垃圾收集。但给出的答案都是不符合条件的。我认为学生 [0] 指的是字符串“Peter Parker”,而 studentName 也是如此。现在 studentName 指的是为空,学生[0]仍然指的是“彼得帕克”(我通过打印出来检查了这一点)。给出的解释是学生[0]仍然指的是学生名,所以学生名也没有资格进行垃圾收集。但我'我不明白这一点,因为 studentName 现在指的是 null 而学生 [0] 指的是“Peter Parker”。我的理解错了吗?

【问题讨论】:

  • 你能提供一个链接到那个说它指的是studentName而不是字符串"Peter Parker"的地方吗?
  • 没有字符串引用符合垃圾回收条件
  • 我认为您应该将这篇文章的标题更改为有助于未来访问者、搜索引擎帮助找到这篇文章的内容。
  • 所以这里是解释的链接link 最后一句说对象 studentName 也不符合条件,所以这很令人困惑,因为 studentName 是一个引用变量,它现在引用 null。

标签: java string


【解决方案1】:

在执行studentName = null; 之前,studentNamestudents[0] 都持有对同一个String 对象(其值为"Peter Parker")的引用。当您将null 分配给studentName 时,students[0] 仍然引用该对象,因此它不能被垃圾回收。

Java 不会垃圾收集引用变量,它会垃圾收集这些变量引用的对象,一旦不再引用它们。

【讨论】:

    【解决方案2】:

    这里 String 对象是用"Peter Parker" 创建的,studentName 是 只是参考它。 Java 将垃圾收集那些对象 丢失且没有参考,在这里您与参考混淆 studentName。通过将null 分配给studentName,您只是在删除 "Peter Parker" 的一份参考资料;但它仍然由数组元素引用, 所以它不会被垃圾收集。

    【讨论】:

      【解决方案3】:

      你有多少个对象?

      你有两个对象:

      • 字符串"Peter Parker"
      • 字符串数组。

      这些对象有多少引用?

      三个参考:

      • 变量studentName 正在引用字符串对象。
      • 变量students 正在引用数组对象。
      • 数组对象的第一个位置students[0]也引用了字符串对象。

      代码执行后对这些对象的引用有多少?

      执行此行后:

      studentName = null;
      

      仅删除了三个引用中的第一个。我们还有 两个 参考文献。

      这两个对象是否符合垃圾回收条件?

      ,因为:

      • 数组对象仍被students 变量引用。
      • 字符串对象"Peter parker"仍被数组对象的第一个位置students[0]引用。

      由于这两个对象仍然在某处被引用,所以它们都没有资格进行垃圾回收。


      PS:我故意对对象使用了通用的“字符串”和“数组”术语,因此在心理上将它们与代码中的实际 String 和 String[] 变量区分开来更容易。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-17
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 2013-09-23
        相关资源
        最近更新 更多