[英]Why this String is not eligible for garbage collection?
以下代码创建一个数组和一个字符串对象。 代码执行后,对这些对象有多少引用? 对象是否有资格进行垃圾回收?
...
String[] students = new String[10];
String studentName = "Peter Parker";
students[0] = studentName;
studentName = null;
...
我的回答是studentName有资格进行垃圾收集。但是给出的答案都不符合条件。我认为学生[0]指的是字符串“Peter Parker”,studentName也是这样。现在studentName指的是null,学生[0]仍然指的是“Peter Parker”(我通过打印出来检查了这一点)。给出的解释是学生[0]仍然指的是studentName所以studentName也没有资格进行垃圾收集。但我不理解因为studentName现在指的是null而学生[0]指的是“Peter Parker”。我的理解是错的吗?
在studentName = null;
之前studentName = null;
执行时, studentName
和students[0]
都持有对同一String
对象(其值为"Peter Parker"
)的引用。 当您为studentName
指定null
, studentName
students[0]
仍然引用该对象,因此无法进行垃圾回收。
Java不会垃圾收集引用变量,一旦没有对这些变量的引用,它就会收集这些变量引用的对象。
这里String对象是用"Peter Parker"
创建的, studentName
只是引用它。 Java将垃圾收集那些丢失并且没有引用的对象,在这里你与参考studentName
混淆。 通过为studentName
指定null
,您只需删除一个"Peter Parker"
引用; 但它仍然由数组元素引用,所以它不会被垃圾收集。
你有两个对象:
"Peter Parker"
有三个参考:
studentName
正在引用字符串对象。 students
正在引用数组对象。 students[0]
也引用了字符串对象。 执行此行后:
studentName = null;
只删除了三个引用中的第一个。 我们还剩下两个参考文献。
不 ,因为:
students
变量引用。 "Peter parker"
仍然由数组对象的第一个位置students[0]
引用。 由于两个对象仍在某处引用,因此它们都不符合垃圾回收的条件。
PS:我有意为对象使用通用的“字符串”和“数组”术语,因此更容易在心理上将它们与代码中的实际String和String []变量分离开来。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.