2009-07-02 37 views
2

如果我有一個數組說 -
int[] a = new int[10];gc問題:10個整數單個對象或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個額外的對象,而在第二種情況下我們沒有。

回答

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(); 
} 
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 
3

一個真正的答案(中,一個感覺,會告訴你第一種情況是否真的更昂貴的垃圾收集)將需要有人誰知道垃圾收集好了很多,比我做的。

但是,試圖僞造垃圾回收器真的很重要嗎? StringMyObject的生命週期幾乎相同,GC非常聰明。這可能會稍微改善垃圾收集時間,但是你爲此付出的代價是,不得不手動管理這兩個數組 - 基本上放棄了OO - 是代碼複雜性和可能的​​錯誤的一個令人討厭的增加。

+0

我同意 - 除非你有*數十億*的物體的營業額,這使得你的氣相色譜工作真的很難 - 不要惹它。 – 2009-07-02 12:27:34

相關問題