带有变量分配的 Java 垃圾收集
Posted
技术标签:
【中文标题】带有变量分配的 Java 垃圾收集【英文标题】:Java Garbage Collection with Assignment of Variables 【发布时间】: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
。
【问题讨论】:
对象是垃圾回收,而不是变量。 【参考方案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”
【讨论】:
以上是关于带有变量分配的 Java 垃圾收集的主要内容,如果未能解决你的问题,请参考以下文章