在下面的代码中,执行第7行后有多少对象符合垃圾回收的条件? 在我看来,1个z对象是合格的。是对的吗?
public class Tester
{
public static void main(String[] args)
{
Integer x = new Integer(3000);
Integer y = new Integer(4000);
Integer z = new Integer(5000);
Object a = x;
x = y;
y = z;
z = null; //line 7
}
}
非常感谢。
答案 0 :(得分:8)
不要将引用与对象混淆。对象是已创建的实际项目,引用只是引用它的名称。
您已创建了三个对象,我们称之为3000
,4000
和5000
。您还可以按如下方式设置参考:
Ref Object
--- ------
x -> 3000
y -> 4000
z -> 5000
分配后,您最终得到:
Ref Object
--- ------
a -> 3000
x -> 4000
y -> 5000
z
因此对象都不会被垃圾回收。每一个人都有一个参考。
相比之下,如果您要删除该行:
Object a = x;
然后分配将导致:
Ref Object
--- ------
3000
x -> 4000
y -> 5000
z
我们调用3000
的和对象将有资格进行垃圾回收,因为您无法再以任何方式访问它。
而且,顺便说一下,你可能想要考虑这样一个事实,即创建自动垃圾收集的一个主要原因是使这些问题没有实际意义:-)一般来说(虽然当然有例外),你不应该't 需要担心哪些对象可以收集。
答案 1 :(得分:2)
没有任何对象符合垃圾收集条件。
每个对象都有一个实时引用。 z
不是Object,它只是一个引用。您仅移动了参考文献。
答案 2 :(得分:1)
x,y和z不是对象 - 它们是对象的引用。
非正式地说,任何对象都有资格进行垃圾回收,因为你无法再访问它了。运行此代码后,x引用3000对象,y引用4000对象,z引用5000对象。无法收集3000对象,因为您可以使用它,例如System.out.println(a);
。无法收集4000对象,因为您可以通过x使用它,例如System.out.println(x);
。无法收集5000对象,因为您可以通过z使用它。
main
返回后,所有这些对象都有资格进行垃圾回收,因为之后你无法访问它们。
答案 3 :(得分:1)
z将不符合第7行的GC条件。这是因为在第6行中,y正在重新呈现之前由z引用的对象。因此,即使您已经创建了z=null
,y仍然会重新生成堆中创建的对象,即。 new Integer(5000);