4

StringBuildersでSystemOutOfMemory例外が発生します。RAMの不足によるものではないので、メモリの断片化だと思います。

〜200個のStringBuilerオブジェクトがあります。これらはすべて定期的に再利用されます(strBldr.clear()を使用)。これにより、私のシステムはメモリをかなりひどく断片化するようです。どうすればこれを解決できますか?

ありがとう :)

編集:

ここにいくつかのデータがあります:

input&stringBuilderの最大記録サイズ:4146698。

Avarageが再起動したstringBuilders/秒:> 120(おそらく>> 120)

入力の長さ@最初のエラー:16 972(文字列)

StringBuilderの長さ@最初のエラー:16

新しいstringBuilderが作成された回数@最初のエラー:〜32500

合計RAM使用量@最初のエラー637448K

4

3 に答える 3

4

そのようなものを再利用するのではなくStringBuilder、必要に応じて新しいものを作成するだけです。

を呼び出すClearと、StringBuilder使用していたすべてのメモリが解放されるわけではなく、使用されているサイズがゼロにリセットされるだけです。それでも同じ大きなバッファがあり、唯一の繰り返し使用はStringBuilder、バッファが必要なだけ大きくなり、決して縮小しないことを意味します。

また、StringBuilderオブジェクトを再利用できるように保持するということは、オブジェクトがガベージコレクションを処理し、次世代のヒープに移動することを意味します。それらは収集される頻度が少ないため、メモリの断片化を感知する可能性が高くなります。

于 2011-05-14T11:14:23.650 に答える
4

私は同意します、おそらくあなたはメモリを使い果たしているのではなく、断片化に陥っています。

断片化とラージオブジェクトヒープ(LOH)について理解する必要があります。

あなたは詳細を提供しないので、私はいくつかの非常に幅広いアドバイスしか与えることができません:

  • 文字列の大きさを見積もり、新しいSBのCapacityパラメーターを使用してみてください
  • それらのサイズを(実際には)いくつかの数の倍数に切り上げます。これにより、再利用が促進されます。
  • Clear()は、新しいコンテンツが古いコンテンツとほぼ同じサイズであると予想される場合にのみ使用してください。

編集

input&stringBuilderの最大記録サイズ:4146698。

  • より大きなサイズの中間体が必要ないことを確認してから
  • 次のようなすべてのStringBuilderを作成しますsb1 = new StringBuilder(4200000);
  • それらを再利用しようとしないでください(多すぎる/まったく)
  • それらを長すぎないでください
于 2011-05-14T11:28:37.117 に答える
0

私がやったことは、x64への移行です。これで私の問題は解決しました。

すべてを使用していなくても、x86のメモリスペース全体を誤って割り当てた可能性があります。x64に移行すると、確かにその問題は解決します。

于 2011-05-15T16:49:38.207 に答える