当堆大小增加时,为什么堆的使用量会减少?

时间:2013-02-21 21:44:27

标签: java

我正在将一个大文本文件读入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并观察内存如何用尽:

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();

enter image description here

1 个答案:

答案 0 :(得分:2)

BufferedReader是一个与FileReader对象一起使用的抽象层。为了提高效率,当您滚动输入时,它很可能会重复或缓冲FileReader数据的某些部分。

我们希望库提供给我们的高效BufferedReader,一旦认为不相关,可能会丢弃这些数据。垃圾收集器会定期清除这些无关数据。

这是我可以想到的周期堆大小减少的最合理的原因。