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

  • 创建了多少个对象
  • 当达到//做东西的行时,有多少个对象可以使用gc。

  • 根据这本书,答案是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
        }
    }
    

    在回答第一个问题时,是否在每次实例化数十个实例时还将int [] dz对象也算作一个附加对象?

    同样,当您达到//做东西时,在为每个Dozens对象计算可用于gc的对象的数量时,您是否还计算其中包含的int [] dz对象?

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

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

    谢谢。

    最佳答案

    我在下面的代码中添加了注释,以突出显示在哪里创建或丢失引用。

    在计算分配时,必须包括存储在字段dz中的阵列的分配。我的怀疑是,您将对象引用对da [0]和da [1]的分配计为分配。由于他们正在复制参考,而不是创建新对象;它们仅影响对象何时可以变为GCable,而不创建新对象。

    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

    10-04 10:19