从大量列表中获取数据并对其进行处理 - 堆空间错误

时间:2014-04-30 06:27:11

标签: java garbage-collection heap-memory weak-references

我的数据采用如下数据结构:

List <List<Long>> data;

我已经说过数千个这样的列表,每个列表中有10到数百个元素。我需要一次处理每个列表并从中创建对象以存储到硬盘上的文件中。 我正在使用循环迭代器,如:

for(List <Long> chunk : data) {
   process(chunk);
   writeTofile(chunk);
}

但是我得到了Java堆空间的OutOfMemory错误。我使用Eclipse Memory Analyzer检查了堆,并且由于弱引用而导致内存泄漏。进程(块)函数也是块大小的指数函数。

是否为data.size()中的每个块创建了新的内存空间,或者data.get(1)使用的相同空间现在是否用于data.get(2)? 有什么帮助来克服这个问题 以下代码在内存利用方面有何不同?:

List <Long> chunk;
for(chunk : data) {
   process(chunk);
   writeTofile(chunk);
   chunk.clear();
}

在有效的垃圾收集方面,数组是否是更好的工具?我用-Xmx11g来运行这个程序。请指教。感谢

1 个答案:

答案 0 :(得分:0)

调用chunk后,process(chunk)列表看起来需要更多空间。看起来您在处理之前已经为所有data提供了足够的内存,但此后却没有。因此,在使用时清除块似乎是正确的解决方案。通常,使用数组而不是集合是一个坏主意:数组是旧的低级内容,主要用作集合的构建块。

如果您有很多非常短的集合,那么切换到数组可能是有利可图的。在处理原语的情况下也是如此。 List<Long>的内存消耗可能是相同大小的内存消耗long[]的三倍。您可以通过使用例如数组来获得集合的舒适性和阵列的紧凑性。 trove原始集合。