1

大きなテキスト ファイルを 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();

ここに画像の説明を入力

4

1 に答える 1

2

BufferedReader は、FileReader オブジェクトと連携する抽象化レイヤーです。効率を高めるために、入力をロールスルーするときに FileReader のデータの特定の部分を複製またはバッファリングする可能性があります。

ライブラリが提供してくれることを期待している効率的な BufferedReader は、このデータが無関係であると見なされると、おそらくこのデータを破棄します。この無関係なデータは、ガベージ コレクターによって定期的に消去されます。

これは、定期的なヒープ サイズの減少について私が考えることができる最も妥当な理由です。

于 2013-02-21T21:49:50.233 に答える