1. ホーム

[解決済み] [Solved] java.lang.OutOfMemoryError: GC オーバーヘッドの制限を超えました [重複]。

2022-03-26 06:15:56

質問

数個(15~20個)のテキスト項目を持つHashMapオブジェクトを複数(数十万個)作成するプログラムで、このエラーが発生しました。これらの文字列は、データベースに送信される前に、すべて(より小さい量に分割されることなく)収集されなければなりません。

Sunによると、このエラーはガベージコレクションにあまりにも多くの時間が費やされている場合に発生します。ガベージコレクションに全体の98%以上の時間が費やされ、ヒープの2%未満しか回復していない場合、OutOfMemoryErrorがスローされます。

どうやら、コマンドラインを使って、JVMに引数を渡すことで

  • ヒープサイズを大きくするには、"-Xmx1024m" (またはそれ以上)を使用します。
  • XX:-UseGCOverheadLimit"により、エラーチェックを完全に無効にする。

最初の方法はうまくいきましたが、2番目の方法は別の java.lang.OutOfMemoryError で、今回はヒープに関するエラーに終わりました。

そこで質問ですが、特定のユースケース(つまり、いくつかの小さなHashMapオブジェクト)に対して、これに代わるプログラム的な方法はあるのでしょうか?例えば、HashMapのclear()メソッドを使えば、問題は解決しますが、HashMapに格納されているデータも消えてしまいます! :-)

また、この問題については StackOverflowの関連トピックにあります。

解決方法を教えてください。

本来、処理をスムーズに行うためのメモリが不足しているのでは?思いつく選択肢

  1. ご指摘のようにメモリを多めに指定して、次のような中間的なものを試してみてください。 -Xmx512m 最初
  2. の小バッチで作業する。 HashMap 可能であれば、一度に処理するオブジェクト
  3. 重複する文字列が多い場合は String.intern() に入れる前に HashMap
  4. を使用します。 HashMap(int initialCapacity, float loadFactor) のコンストラクタを使用して、あなたのケースに合わせてチューニングします。