2014-02-17 80 views
2

在下面的代码中,有多少对象在执行第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 
    } 
} 

非常感谢。

回答

8

不要混淆引用与对象。该对象是已创建的实际项目,该引用仅仅是一个引用它的名称。

您已经创建了三个对象,我们称它们为3000,40005000。你还设置了引用如下:

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将有资格进行垃圾回收,因为您不再有任何方式访问它。


而且,顺便说一句,你可能要考虑这样一个事实的重要原因自动垃圾收集创建一个是使这些各种各样的问题毫无意义:-)一般来说(虽然也有例外当然的),你不应该需要担心什么对象被收集。

2

没有任何对象符合垃圾收集条件

每个对象都有一个实时引用。 z不是一个对象,它只是一个参考。您只移动了参考。

1

x,y和z不是对象 - 它们是对象的引用。

非正式地,任何对象都有资格进行垃圾回收,如果没有办法可以永远访问它。运行此代码后,x指向3000对象,y指向4000对象,z指向5000对象。无法收集3000物品,因为您可以使用它,例如System.out.println(a);。无法收集4000对象,因为您可以通过x来使用它,例如System.out.println(x);。 5000对象无法收集,因为您可以通过z使用它。

main返回后,所有这些对象都有资格进行垃圾回收,因为之后无法访问它们。

1

z将不符合第7行的GC要求。这是因为在第6行中,y正在折回先前由z引用的对象。所以即使你认为你已经做出了z=null,y仍然在折叠在堆中创建的对象即。 new Integer(5000);