メモリリークが発生しているか、格納している文字列データの量が間違っています。私たちは、あなたのコードをもっと見ていないとわからない。
科学的な解決策は、メモリプロファイラを使用してアプリケーションを実行し、予期せず大量のメモリを使用しているデータ構造を確認するために出力を分析することです。
私は推測した場合、それは(いくつかのレベルでの)アプリケーションは、このような何かをやっていることを次のようになります。
String line;
while ((line = br.readLine()) != null) {
// search for tag in line
String tagStr = line.substring(pos1, pos2);
// code as per your example
}
は、これは、あなたが期待するよりも多くのメモリを使用しています。 substring(...)
コールは、元のline
文字列のバッキング配列を参照するtagStr
オブジェクトを作成します。短いと思われるタグ文字列実際にはは、元の行のすべての文字を保持するchar[]
オブジェクトを参照しています。
修正はこれを行うことです。
String tagStr = new String(line.substring(pos1, pos2));
これは、引数文字列の補助配列を共有しないStringオブジェクトを作成します。
更新 - このようなものは、あなたの最新のデータがあれば、ますます起こりそうな説明です。
Jon Skeetの別のポイントで拡張すると、小さなStringのオーバーヘッドは驚くほど高くなります。例えば、典型的な32ビットのJVMに、1つの文字列のメモリ使用量がある:文字列オブジェクトの
- Stringオブジェクトヘッダ:2つのワード
- Stringオブジェクトフィールド:3つのワード
- パディング:1ワード(と思う)
- バッキング配列オブジェクトヘッダ:3つのワード
- バッキング配列データ:1つのワード
合計:10ワード - 40バイト - 保持する一つのデータの...または入力が8ビット文字セットの場合はbyte
のデータです。
(これはあなたの問題を説明するのに十分ではありませんが、とにかくそれを認識する必要があります。)
多くのデータを入れない限り、HashSetの問題は起こりそうにないと思います。格納している文字列のサイズは?ファイル全体を一度にメモリまたは1行に読み込んでいますか?ここで提供したデータは、実際に役立つ情報を十分に提供していません。 –
テーブルがクラッシュするまでにいくつのアイテムが含まれていますか? –
そして要素の平均の長さ/サイズはどれくらいですか? –