java - 优化重复数组分配

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

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

最佳答案

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

关于java - 优化重复数组分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22914783/

相关文章:

java - 新 Intent 未从服务开始(尝试了 Google 的所有解决方案)

php - 使用 array_udiff 比较两个对象数组

java - Java中的整数缓存

c++ - 变量而不是类调用

c++ - 从简单函数中删除 if 条件

java 图形 - 具有两种颜色的形状

java - Elasticsearch批量索引Java API不工作

java - Swing JLabel 将 unicode "\u21B5 "显示为文本不起作用

arrays - TypeScript 对象作为 C# 中的字典类型

c - 如何将大量 uint_8 转换为 C 中的 float 组?