繁体   English   中英

为什么此String不符合垃圾回收的条件?

[英]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; 执行时, studentNamestudents[0]都持有对同一String对象(其值为"Peter Parker" )的引用。 当您为studentName指定nullstudentName 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM