对垃圾收集感到困惑

时间:2014-02-17 05:36:50

标签: java

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

非常感谢。

4 个答案:

答案 0 :(得分:8)

不要将引用与对象混淆。对象是已创建的实际项目,引用只是引用它的名称。

您已创建了三个对象,我们称之为300040005000。您还可以按如下方式设置参考:

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);