对垃圾收集感到困惑

T8Z*_*T8Z 2 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 
   }
}
Run Code Online (Sandbox Code Playgroud)

非常感谢你.

pax*_*blo 8

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

你创建了三个对象,让我们调用它们3000,4000然后5000.您还设置了如下引用:

Ref    Object
---    ------
 x  ->  3000
 y  ->  4000
 z  ->  5000
Run Code Online (Sandbox Code Playgroud)

完成作业后,您最终得到:

Ref    Object
---    ------
 a  ->  3000
 x  ->  4000
 y  ->  5000
 z
Run Code Online (Sandbox Code Playgroud)

因此,没有任何对象受到垃圾收集.每一个人都有一个参考.


相比之下,如果您要删除该行:

Object a = x;   
Run Code Online (Sandbox Code Playgroud)

那么分配将导致:

Ref    Object
---    ------
        3000
 x  ->  4000
 y  ->  5000
 z
Run Code Online (Sandbox Code Playgroud)

我们调用的对象3000有资格进行垃圾回收,因为您不再有任何方法可以访问它.


而且,顺便说一句,你可能想要考虑这样一个事实,即创建自动垃圾收集的一个主要原因是使这些问题没有实际意义:-)一般来说(虽然当然有例外),你不应该需要担心哪些对象可以收集.