.NET3.5アプリケーションを使用しています
- 関数が100万回実行されている
- 1MB以上の文字列(異なるサイズの文字列)で検索、置換、正規表現の操作を実行します
アプリケーションのプロファイルを作成すると、これらの文字列がLOHに保存されていることを確認できますが、後でGCによって再利用されるため、特定の時点で最大10個の文字列のみがLOHにあります(10スレッドが実行されています)。
私の理解では、これらの大きな文字列はLOHに配置され、GCによって再利用されますが、割り当て場所が原因で(LOHにあるため、圧縮されないため)、断片化が発生します。これは、操作中にメモリリークがないにもかかわらず発生しています。
約100K回は問題を引き起こしませんが、100万回以上に達すると、メモリ不足の例外が発生します。
私はANTSMemoryProfilerを使用していますが、これは初期の実行で得られた結果です。
.NET Using 70MB of 210MB total private bytes allocated in to the application
Number of Fragments: 59
Number of Large Fragments : 48 (99.6% of free memory)
Largest Fragment: 9MB
Free Space: 52% of total memory (37MB)
Unmanaged Memory: 66% of total private memory (160MB)
- 手元のデータに基づいて、私の診断は正しいと思いますか?
- もしそうなら、どうすればこのLOHフラグメンテーションの問題を解決できますか?私はそれらの文字列を処理する必要があり、それらは大きな文字列です。それらを分割してそのように処理する方法を見つける必要がありますか?その場合、分割文字列で正規表現などを実行することは非常に困難です。