为什么以下代码抛出'java.lang.OutOfMemoryError:Java堆空间'

时间:2014-03-08 08:22:21

标签: java arrays out-of-memory heap-memory

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];
}

2 个答案:

答案 0 :(得分:2)

在您的第一个代码段中,您将保留对原始巨大数组的引用,因此保留对随后创建的每个数组的引用。

在你的第二个片段中,你丢弃了对原始巨大数组的引用 - 事实上,在循环的每次迭代中,你将丢弃对每个数组的引用,除了你创建的数组。因此,它允许除了其中一个之外的所有内容都被垃圾收集,并且您只需要在循环中的任何一点为两个数组提供足够的堆空间。

答案 1 :(得分:1)

因为在第二种情况下,您没有所有Object[]

的实时参考