大量のデータ (csv など) をロードするアプリケーションを開発しています。
読み取ったセルを作成List<List<SimpleCell>>
してロードしています。SimpleCell クラスには 5 つの * が含まれString
、それぞれString
平均 10 文字です。
SimpleCell
したがって、1000*160=160 000のインスタンスを与える 1000 行 (それぞれが 160 列を含む) を読み取ると、約 160 000 * sizeof(SimpleCell.class)
=~ 160 000 * 10 * 5 = 8 000 000になると考えています。バイト =~ 7.63 MB。
しかし、jconsole を見ているとき (そして をクリックした後Perform GC
) のメモリ使用量は約 790MB です。これはどうやってできるの?
「一時的な」オブジェクトへの参照は保存しないことに注意してください。メモリ使用量が上昇したときのコードは次のとおりです。
for(int i = r.getFromIndex(); i <= r.getToIndex(); ++i) {
System.out.println("Processing: 'ZZ " + i + "'");
List<SimpleCell> values = saxRead("ZT/ZZ " + i + "");
rows.add(values);
}
saxRead
inputStream を作成するだけで、それを SAX で解析し、ストリームを閉じて、セル (SAXHandler によって作成) を返します。つまり、ローカル変数しかありません (近い将来に破棄されると思います)。
out of heap error
1000 行を読み取ったときに取得していますが、約 7k を読み取る必要があります。
明らかに-jvmメモリについて私が知らないことがあります。では、この比較的少量のデータをロードするときにメモリ使用量が非常に大きくなるのはなぜでしょうか?