Java垃圾回收5

3

这段代码来自一本书。问题是:

  1. 创建了多少个对象?
  2. 当达到// do stuff这一行时,有多少个对象可以进行垃圾收集?

根据这本书的说法,答案分别为5和2。以下是代码:

class Dozens {
    int[] dz = {1,2,3,4,5,6,7,8,9,10,11,12};
    }

public class Eggs{
    public static void main(String[] args){
        Dozens[] da = new Dozens[3];
        da[0] = new Dozens();
        Dozens d = new Dozens();
        da[1] = d;
        d = null;
        da[1] = null;
        // do stuff
    }
}

针对第一个问题,当您实例化Dozens时,您是否还将int [] dz对象计算为每个附加对象?

同样地,在到达// do stuff时,在计算有多少个对象符合进行垃圾回收的条件时,对于每个Dozens对象,您是否也计算其中包含的int [] dz对象?

我没有计算int [] dz对象,并得出了答案5和3。

有人能解释一下我可能做错了什么吗?

谢谢。


不要忘记,创建一个数组对象来保存传递给main方法的(可能为空的)命令行参数,并创建一个字符串对象来保存每个命令行参数(如果有的话)。 - Bobulous
1个回答

4
我已经在下面的代码中用注释标出了引用创建或丢失的位置。
在计算分配时,必须包括存储在字段 dz 中的数组的分配。我怀疑您将对象引用分配给 da [0] 和 da [1] 也算作了分配。由于它们只是复制引用,而不是创建新对象;它们仅影响对象何时可以成为可回收的,并不会创建新对象。
class Dozens {
    int[] dz = {1,2,3,4,5,6,7,8,9,10,11,12};
}

public class Eggs{
    public static void main(String[] args){
        Dozens[] da = new Dozens[3];  // +1 object, the array containing 3 nulls
        da[0] = new Dozens();         // +2 objects, Dozens and the array in Dozens.dz
        Dozens d = new Dozens();      // +2 objects, Dozens and the array in Dozens.dz
        da[1] = d;                    // +0, d now has two refs to it
        d = null;                     // +0, d now has one ref to it
        da[1] = null;                 // -2, d now has no refs to it so both d and its internal array become available for GC
        // do stuff
    }
}

将总数相加得到,1+2+2=5个分配。末尾的-2说明有2个对象可以供GC使用。

非常感谢您的出色解释。它消除了我一些误解。再次感谢。 - user3516726

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接