优化重复的数组分配

时间:2014-04-07 14:05:55

标签: java arrays optimization memory-management garbage-collection

考虑这些类似的代码:

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,而第二个算法的缺点是数组永远不会在迭代之间进行垃圾收集,即使可能是在某些点之后迭代不再使用数组了。

在哪种情况下使用哪种算法更好?

2 个答案:

答案 0 :(得分:1)

首先,为什么你认为你会得到StackOverflowException?该数组将存储在堆上(引用将在堆栈上)。 其次,GC在两种情况下都足够聪明,可以清理内存。实际上,一旦不需要引用,垃圾收集器就可以调用内存(它可以调用内存,同时还在方法中。)

答案 1 :(得分:1)

除非您的数组太大以至于每次迭代都必须解除分配,否则每次重新分配它都没有任何好处。