2016-04-05 3 views
1

ハッシュマップに> 100000個のオブジェクトを設定するときに、GCオーバーヘッドの上限を超えました。アーキテクチャー:ハッシュマップを作成するときにGCオーバーヘッドの問題を解決する方法

プログラムの起動時に、CSVファイルのキー:値のペアから読み込みます。次に、文字列をキーとし、各値のオブジェクトのハッシュセットを含むハッシュマップを構築します。

最後に、これらのマッピングに基づいて統計情報を出力するので、この方法を使用すると便利です。

いくつかのオプションがあります: - オブジェクトのサイズを小さくします。問題を減らすことができますが、より多くのオブジェクトで持続する可能性があります。 - デフォルトのマップサイズと負荷率を設定します。同上。 - ヒープサイズを大きくします。同上。 - オブジェクトを順次処理して破棄します。問題は修正されますが、オブジェクトのマッピングは失われます。 - ストレージをDBにオフロードしますか?

大変感謝しています。

+1

既にあなたはhttp://stackoverflow.com/questions/1393486/error-java-lang-outofmemoryerror-gc-overhead-limit-exceeded/を調べていますか? –

答えて

1

ヒープサイズを増やすことができれば、それは最初の最も簡単なステップです。


初期集団で収集するGCのゴミの量を最小限に抑えることも試みます。

initialSizeを、予想されるサイズに近い値に設定してください。 HashMapは、再ハッシュ/リサイズ中に多くのゴミを生成し、可能であれば避けるべきです。 HashSetにはHashMapが付いているので、HashSetと同じことを行う必要があります。

(注目に値する、HashMapは通常問題ではありませんが、あなただけのサイズ変更しきい値を引き継ぐだろう非常に大きなデータセットを持っている場合、それは必要なメモリの二重の量を割り当てることができサイズが倍になります。)

HashMap´s javadocによれば、再ハッシュ/サイズ変更が行われないように、expectedSize/loadFactorのinitialSizeを使用する必要があります。 (あなたがexpectedSizeより大きい最適INITIALSIZE 33.33333%をもたらすであろう0.75のデフォルトloadFactorを使用している場合)ヒープサイズの要件は、あなたのセットアップのためには大きすぎるされて終わる場合


最後に、次のステップは、あまりにも見ていますオフメモリソリューションEhcacheからconfigure to have a backing persistence storage if the cache takes too much memoryできるメモリキャッシュのような。

あなたが質問した場合でも、データベースです。

関連する問題