首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java垃圾收集5

Java垃圾收集5
EN

Stack Overflow用户
提问于 2014-09-19 15:56:11
回答 1查看 504关注 0票数 3

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

  1. 创建了多少个对象
  2. 到达行// do时,有多少对象有资格使用gc。

根据这本书,答案是5和2。下面是代码:

代码语言:javascript
复制
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。

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-19 16:00:53

我已经用注释注释了下面的代码,以突出显示创建或丢失引用的位置。

在计算分配数时,必须包括存储在dz字段中的数组的分配。我怀疑您将对da和da1的对象引用的赋值计算为分配。因为它们是在复制引用,而不是创建新对象;它们只会影响对象成为GCable而不创建新对象的时候。

代码语言:javascript
复制
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。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25937927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档