gc问题:单个对象或10个对象的10个整数数组?

时间:2009-07-02 04:45:35

标签: java garbage-collection

如果我有一个阵列说 -
int[] a = new int[10];

Java GC在进行收集时会将其视为10个对象还是单个对象?

更新
所以根据给定的答案,从GC的角度来看它不是更有效而不是

List l; 
for(i =0;i<1000;i++)  
  l.add(new MyObj(343,"asdfasfd"));  

我们应该做 -

int[] a; String[] b;
for(i =0;i<1000;i++)  {
  a[i]=343;
  b[i] = "asfasfsafsaf";
}

因为在第一种情况下我们最终创建了1000个额外的对象,而在第二种情况下我们没有。

3 个答案:

答案 0 :(得分:10)

这是一个单一的对象。数组是一个连续的对象,int是基本类型,而不是对象类型,因此没有为10 int创建的对象。

// 1 object
int[] intArray = new int[10];

如果你有一个10 Object的数组,则会有11个对象:10个对象加上数组。数组本身仍然只是一个对象;它碰巧包含对其他10个对象的引用。

// 1 object...
Object[] objectArray = new Object[10];

// ...Plus 1 for each element once they are instantiated.
for (int i = 0; i < 10; ++i) {
    objectArray[i] = new Object();
}

答案 1 :(得分:3)

就垃圾收集而言,数组是单个对象。如果它是一个原始类型数组,如int,那么只涉及一个对象,整个数组都是GC'd,或者都不是。

如果你有一个引用类型数组,比如Object,那么这就是数组的一个对象,加上最多10个对象用于数组引用的引用类型(所以10个引用的数组可能涉及最多11个对象)。如果从数组中删除其中一个对象,比如将其设置为null,或者用另一个对象覆盖它,并且如果该对象未被其他任何变量引用,那么它将有资格进行垃圾回收。例如:

Object a = new Object(); // "Our Object"
Object[] array = new Object[10];
array[0] = a;
a = null; // a no longer references our Object
// now array[0] is the only reference to our Object
// and it isn't eligible for garbage collection yet
array[0] = null;
// Now our Object is eligible for garbage collection

答案 2 :(得分:3)

一个真正的答案(在某种意义上说,会告诉你第一个案例是否实际上更加垃圾收集)将会让那些比我更了解垃圾收集器的人。

但尝试假装垃圾收集器真的那么重要吗? StringMyObject的生命周期几乎相同,GC非常聪明。你可能会略微改善你的垃圾收集时间,但你需要为此付出代价,不得不手动管理两个阵列 - 基本上放弃OO - 代码复杂性和可能的​​错误是一个令人讨厌的增加。