我的数据采用如下数据结构:
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来运行这个程序。请指教。感谢
答案 0 :(得分:0)
调用chunk
后,process(chunk)
列表看起来需要更多空间。看起来您在处理之前已经为所有data
提供了足够的内存,但此后却没有。因此,在使用时清除块似乎是正确的解决方案。通常,使用数组而不是集合是一个坏主意:数组是旧的低级内容,主要用作集合的构建块。
如果您有很多非常短的集合,那么切换到数组可能是有利可图的。在处理原语的情况下也是如此。 List<Long>
的内存消耗可能是相同大小的内存消耗long[]
的三倍。您可以通过使用例如数组来获得集合的舒适性和阵列的紧凑性。 trove原始集合。