这段代码来自一本书。问题是,
根据这本书,答案是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对象计算为每次实例化数十个附加对象?
类似地,当您到达// do时,在计算符合gc条件的对象数量时,对于每几十个对象,您是否也计算了其中包含的int[] dz对象?
我没有计算int[] dz对象,并得到了答案5和3。
有人能解释我做错了什么吗?
谢谢。
发布于 2014-09-19 16:00:53
我已经用注释注释了下面的代码,以突出显示创建或丢失引用的位置。
在计算分配数时,必须包括存储在dz字段中的数组的分配。我怀疑您将对da和da1的对象引用的赋值计算为分配。因为它们是在复制引用,而不是创建新对象;它们只会影响对象成为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。
https://stackoverflow.com/questions/25937927
复制相似问题