当我做以下操作时:
public double[] someFn()
{
double[][] b = new double[5][5];
return b[2];
}
是缓冲区b的其余部分准备好进入垃圾箱,还是仍然在某个地方使用ref到第二行阻止整个数组b被收集?
当我在谈论泛型数组时,我不能测试结束…
是的,b
的每个元素只是对double[]
的引用。每个元素都可以是对一个独立对象的引用,或者多个元素可以引用同一个数组,或者为空值。
元素和包含它的数组之间没有反向链接。
基本上,您应该将"多维"数组视为普通数组,其中元素类型恰好是另一个数组。例如:
String foo() {
String[] array = getStrings();
return array[0];
}
方法返回的字符串引用不知道数组的任何信息,它所引用的字符串对象也不知道。对于数组的数组也是一样的
在someFn()返回后,b的其他元素将准备被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-ed1 - 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