这段代码来自一本书。问题是,
根据这本书,答案是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