Part1抛出错误,而part2没有,为什么?
//part 1
Object[] arr = new Object[10000000];
Object[] arr1 = arr;
for(int i = 0; i < 100; i++) {
arr1[0] = new Object[10000000];
arr1 = (Object[]) arr1[0];
}
//part 2
Object[] arr1 = new Object[10000000];
for(int i = 0; i < 100; i++) {
arr1[0] = new Object[10000000];
arr1 = (Object[]) arr1[0];
}
答案 0 :(得分:2)
在您的第一个代码段中,您将保留对原始巨大数组的引用,因此保留对随后创建的每个数组的引用。
在你的第二个片段中,你丢弃了对原始巨大数组的引用 - 事实上,在循环的每次迭代中,你将丢弃对每个数组的引用,除了你创建的数组。因此,它允许除了其中一个之外的所有内容都被垃圾收集,并且您只需要在循环中的任何一点为两个数组提供足够的堆空间。
答案 1 :(得分:1)
因为在第二种情况下,您没有所有Object[]