【发布时间】:2014-05-19 20:03:21
【问题描述】:
考虑这些类似的代码:
for (int iteration = 0; iteration<a_lot; iteration++) {
int[] re = new int[large];
for (int i = 0; i<large; i++)
re[i] = computeValue();
...
}
和
int[] re = new int[large];
for (int iteration = 0; iteration<a_lot; iteration++) {
for (int i = 0; i<large; i++)
re[i] = computeValue();
...
}
在第一个示例中,我们在每次迭代中为数组重新分配新空间,并让垃圾收集器在前一次迭代中释放数组空间,而在第二个示例中,我们重用相同的数组。 我可以想象,在某些情况下,第一个算法会导致(或导致)StackOverflowException,而第二个算法的缺点是数组在迭代之间永远不会被垃圾收集,即使在某个时间点之后可能会出现这种情况数组不再使用的迭代。
在什么情况下使用哪种算法更好?
【问题讨论】:
-
显然第二个数组最终会被垃圾回收。除非您将其存储在类级别,否则它会在某些时候超出方法范围。
-
这个问题/答案对您有帮助吗? stackoverflow.com/questions/377763/…
-
@Kon 这是真的,请参阅编辑。 "数组永远不会被垃圾回收在迭代之间"
-
@RaulGuiu 我不认为这是同一个问题。我的问题是关于数组分配,而不是变量声明及其范围。
标签: java arrays optimization memory-management garbage-collection