第 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];
}
最佳答案
在您的第一个代码片段中,您将保留对原始大型数组的引用,因此保留对您随后创建的每个数组的引用。
在第二个片段中,您将丢弃对原始大数组的引用 - 事实上,您将在循环的每次迭代中丢弃对除您创建的数组之外的每个数组的引用。因此,除了其中一个之外,其他所有数组都可以被垃圾收集,并且您只需要在循环中的任何点为其中两个数组提供足够的堆空间。
关于java - 为什么下面的代码抛出 'java.lang.OutOfMemoryError: Java heap space',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22266942/