7

かなり大きなアルゴリズムで、テキストファイルからのさまざまなデータを評価しています。

テキストファイルに複数のデータポイントが含まれている場合 (必要な最小値は 130 万データポイントのようです)、次のエラーが発生します。

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
   at java.util.regex.Matcher.<init>(Unknown Source)
   at java.util.regex.Pattern.matcher(Unknown Source)
   at java.lang.String.replaceAll(Unknown Source)
   at java.util.Scanner.processFloatToken(Unknown Source)
   at java.util.Scanner.nextDouble(Unknown Source)

インストールされたjre6(標準VM)の次の設定でEclipseで実行しているとき:

-Xms20m -Xmx1024m -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:NewSize=10m 
-XX:MaxNewSize=10m -XX:SurvivorRatio=6 -XX:TargetSurvivorRatio=80 
-XX:+CMSClassUnloadingEnabled

テキストファイルの一部だけを実行すると、正常に機能することに注意してください。

今、私はこの主題について多くのことを読んできましたが、どこかでデータリークが発生したか、配列にデータを保存しすぎているようです (私はそうしていると思います)。

今私の問題は次のとおりです。これを回避するにはどうすればよいですか? 計算を実行できるように設定を変更することは可能ですか?それとも、より多くの計算能力が本当に必要ですか?

4

3 に答える 3

3

本当に重要な vm arg は-Xmx1024mで、VM に最大 1024 メガバイトのメモリを使用するように指示します。最も簡単な解決策は、より大きな数を使用することです。-Xmx2048mマシンにそれを処理するのに十分な RAM があると仮定して、または-Xmx4096m、または任意の数を試すことができます。

他の VM 引数から多くのメリットを得ているかどうかはわかりません。ほとんどの場合、Java に使用するスペースを指定すると、残りのパラメーターが適切に処理されます。-Xmxparam以外のすべてを削除し、それがどのように機能するかを確認することをお勧めします。

より良い解決策は、アルゴリズムを改善しようとすることですが、提案を提供するのに十分な詳細をまだ読んでいません.

于 2013-05-31T20:17:54.600 に答える
1

私はあなたをお勧めします

  • プロファイラーを使用してメモリ使用量を最小限に抑えます。プリミティブ、バイナリ データ、およびよりコンパクトなコレクションを使用することで、10 倍以上削減できると思います。
  • マシンのメモリを増やします。前回、何百もの信号のバックテストを行ったとき、256 GB のメイン メモリがありましたが、これでは十分ではないこともありました。より多くのメモリを取得できれば、より良い結果が得られます。
  • メモリ マップ ファイルを使用して、メモリ効率を高めます。
  • データ セットのサイズを、マシンとプログラムがサポートできるサイズまで減らします。
于 2013-05-31T20:27:35.763 に答える