當我做到以下幾點:Java GC:通用數組的行是獨立對象嗎?
public double[] someFn()
{
double[][] b = new double[5][5];
return b[2];
}
是緩衝液B的休息準備好trashbin或裁判確實仍然在某處使用於2行停止整個數組b中從得到收集?
作爲IM聊天「布特通用陣列,我不能測試定稿...
當我做到以下幾點:Java GC:通用數組的行是獨立對象嗎?
public double[] someFn()
{
double[][] b = new double[5][5];
return b[2];
}
是緩衝液B的休息準備好trashbin或裁判確實仍然在某處使用於2行停止整個數組b中從得到收集?
作爲IM聊天「布特通用陣列,我不能測試定稿...
是的,b
每個元素是只是到double[]
的引用。每個可以是對獨立對象的引用 - 或者多個元素可以引用同一個數組,或者具有空值。
從元素到包含它的數組沒有「反向鏈接」。
基本上,您應該將「多維」數組視爲普通數組,其中元素類型發生爲另一個數組。例如:
String foo() {
String[] array = getStrings();
return array[0];
}
該方法返回的字符串引用不知道該數組的任何內容,也沒有它引用的字符串對象。這與數組數組完全相同。
您在哪裏可以找到這種類型的信息? Java如何在內部處理內存分配情況,如OP描述的情況?有沒有一個規範或類似的東西我可以讀取以瞭解?或者它只是閱讀來源? – 2013-03-16 14:28:50
@KevinBowersox:那麼Java語言規範是一個好的開始:http://docs.oracle.com/javase/specs/jls/se7/html/index.html – 2013-03-16 14:30:36
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
+1用於檢查傳聞! – rhavin 2013-03-16 15:17:14
雖然它們被分配爲獨立的對象,它們可以獨立存在,但它們通常在內存中連續分配,並在內存中保留在內存中r a GC(假設它們全部通過一個參考保留) – 2013-03-16 21:51:27