为什么下面的代码抛出';java.lang.OutOfMemoryError:java堆空间';

为什么下面的代码抛出';java.lang.OutOfMemoryError:java堆空间';,java,arrays,out-of-memory,heap-memory,Java,Arrays,Out Of Memory,Heap Memory,第1部分抛出错误,而第2部分没有,为什么 //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(

第1部分抛出错误,而第2部分没有,为什么

 //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];
}
//第1部分
对象[]arr=新对象[10000000];
对象[]arr1=arr;
对于(int i=0;i<100;i++){
arr1[0]=新对象[10000000];
arr1=(对象[])arr1[0];
}
//第二部分
Object[]arr1=新对象[10000000];
对于(int i=0;i<100;i++){
arr1[0]=新对象[10000000];
arr1=(对象[])arr1[0];
}

因为在第二种情况下,您在第一个代码片段中没有对所有
对象[]
的实时引用,所以您保留了对原始巨大数组的引用,从而保留了对随后创建的每个数组的引用


在第二个代码片段中,您丢弃了对原始巨大数组的引用-事实上,在循环的每次迭代中,您都丢弃了对每个数组的引用,除了您创建的数组。这样,除了一个数组外,所有的数组都可以被垃圾收集,而在循环中的任何一点上,您只需要足够的堆空间来容纳两个数组。

这是一个家庭作业问题吗?对于所有对象[],您指的是arr1或arr1[0]?这些都是引用,我指的是分配的所有引用