【发布时间】:2016-09-26 15:08:10
【问题描述】:
我已经写了一个代码。我面临的问题是,当 for 循环的“j”超过 1000 时,我开始收到“超出 GC 开销限制”的错误。如果我将分配的内存增加到 4GB,我可以迭代到 2000 次,之后会出现同样的问题。我想保留这个增加内存的选项作为最后的手段,并想尝试扩展我的代码。编译器突出显示了我放置箭头的语句的问题。 有人可以指导我这里可能出现的错误。 我已经访问过这个问题Error java.lang.OutOfMemoryError: GC overhead limit exceeded
for (int j=1; j<=num_doc; j++) {
List<Integer> list1 = new ArrayList<Integer>(Collections.nCopies(129039, 0));
BufferedReader fl = new BufferedReader(new FileReader(dataFolder+"file"+ " ("+j+")"+".int"));
String line1;
while((line1=fl.readLine()) != null) {
String[] arr=line1.split(" ");//<---------------------
line1="";
int k = Integer.parseInt(arr[0]);
Arrays.fill(arr, "");
numb=numb+1;
int temp=(list1.get(k))+1;
list1.set(k, temp);
}
F_d.add(numb);
numb=0;
fl.close();
ls2d.add(new ArrayList<Integer>(list1));//<---------------------
list1.clear();
}
【问题讨论】:
-
您是否清除了代码中某处的
ls2d? -
是的 ls2d 被使用。我只粘贴了编译器突出显示的那部分代码。
-
list1已经很大了,所以如果你花时间将它添加到ls2d而不清除它,它会很快占用大量内存从而导致OOME -
很难理解您在这里真正想要实现的目标,但我几乎 100% 肯定有更简单的方法可以实现您的目标,而且只需要一小部分内存。
-
@NicolasFilotto list1.clear 已经存在