我正在将一个大文本文件读入ArrayDeque,
BufferedReader br = new BufferedReader(new FileReader(fname));
String line=null;
//allocate an ArrayDeque with enough room for 50M lines.
ArrayDeque<String[]> inMemory = new ArrayDeque<String[]>(50000000);
while((line=br.readLine())!=null){
String[] lineArr = line.split("\t");
inMemory.add(lineArr);
}
br.close();
我用
运行它java -server -Xmx128g -cp target/stackoverflowquestion-1.0-SNAPSHOT-jar-with-dependencies.jar com.stackoverflow.Question
当我运行代码时,我打开visualvm并观察内存如何用尽:
为什么使用的堆量会定期减少?
编辑:我将String []更改为String。现在它不会发生。 lineArrs在每次循环迭代时都不会消失。
BufferedReader br = new BufferedReader(new FileReader(fname));
String line=null;
//allocate an ArrayDeque with enough room for 50M lines.
ArrayDeque<String> inMemory = new ArrayDeque<String>(50000000);
while((line=br.readLine())!=null){
inMemory.add(line);
}
br.close();
答案 0 :(得分:2)
BufferedReader是一个与FileReader对象一起使用的抽象层。为了提高效率,当您滚动输入时,它很可能会重复或缓冲FileReader数据的某些部分。
我们希望库提供给我们的高效BufferedReader,一旦认为不相关,可能会丢弃这些数据。垃圾收集器会定期清除这些无关数据。
这是我可以想到的周期堆大小减少的最合理的原因。