2013-03-16 75 views
3

當我做到以下幾點:Java GC:通用數組的行是獨立對象嗎?

public double[] someFn() 
{ 
    double[][] b = new double[5][5]; 
    return b[2]; 
} 

是緩衝液B的休息準備好trashbin或裁判確實仍然在某處使用於2行停止整個數組b中從得到收集?

作爲IM聊天「布特通用陣列,我不能測試定稿...

+0

雖然它們被分配爲獨立的對象,它們可以獨立存在,但它們通常在內存中連續分配,並在內存中保留在內存中r a GC(假設它們全部通過一個參考保留) – 2013-03-16 21:51:27

回答

5

是的,b每個元素是只是double[]的引用。每個可以是對獨立對象的引用 - 或者多個元素可以引用同一個數組,或者具有空值。

從元素到包含它的數組沒有「反向鏈接」。

基本上,您應該將「多維」數組視爲普通數組,其中元素類型發生爲另一個數組。例如:

String foo() { 
    String[] array = getStrings(); 
    return array[0]; 
} 

該方法返回的字符串引用不知道該數組的任何內容,也沒有它引用的字符串對象。這與數組數組完全相同。

+1

您在哪裏可以找到這種類型的信息? Java如何在內部處理內存分配情況,如OP描述的情況?有沒有一個規範或類似的東西我可以讀取以瞭解?或者它只是閱讀來源? – 2013-03-16 14:28:50

+2

@KevinBowersox:那麼Java語言規範是一個好的開始:http://docs.oracle.com/javase/specs/jls/se7/html/index.html – 2013-03-16 14:30:36

1

b的其他元素將在someFn()返回後準備好被gc-ed,因爲你不能獲得它們的任何引用。 我寫了一個小程序,以證明:

public class GCDemo { 

static class OneMB { 
    byte[] data = new byte[1024 * 1024]; 
    String name; 

    public OneMB(String name) { 
     this.name = name; 
    } 
    protected void finalize() throws Throwable { 
     System.out.println(name + " gc-ed"); 
    } 
} 

public static OneMB[] someFn() { 
    OneMB[][] b = new OneMB[3][3]; 
    for (int i = 0; i < b.length; i++) { 
     for (int j = 0; j < b[i].length; j++) { 
      b[i][j] = new OneMB(i + "-" + j); 
     } 
    } 
    return b[2]; 
} 

public static void main(String[] args) throws InterruptedException { 
    OneMB[] b2 = someFn(); 
    System.gc(); 
    System.gc(); 
    Thread.sleep(6000); 
    System.out.println("after b2 is released"); 
    b2 = null; 
    System.gc(); 
    Thread.sleep(2000); 
} 

}

輸出是

0-2 GC-ED

1-2 GC-ED

1 -1 gc-ed

0-1 gc-ed

0-0 GC-ED

1-0 GC-ED

B2被釋放後

2-2 GC-ED

2-1 GC-ED

2-0 gc-ed

+0

+1用於檢查傳聞! – rhavin 2013-03-16 15:17:14