9

大量のメモリを処理する必要のある分析アプリケーションをC#で作成しています。メモリ管理を最適化するためにANTSMemoryProfiler7.4を使用しています。そうしているうちに、私が使用している(そして必要な)double [、]配列はすべて、LOHに配置されていることに気付きましたが、これらの配列の最大のものは約24.000バイトです。私の知る限り、オブジェクトは85.000バイトより前に配置しないでください。問題は、これらのdouble [、]配列のインスタンスが約数千あるため、メモリの断片化が多いことです(合計メモリ使用量の約25%は、使用できない空きメモリです)。LOHに格納されているこれらの配列の一部は、サイズがわずか1.036バイトですらあります。問題は、より大規模な分析を実行しなければならない場合があり、LOHの断片化による大量のメモリ損失のために、メモリ不足の例外が発生することです。

定義上大きなオブジェクトであってはならないのに、なぜこれが起こっているのか誰かが知っていますか?

ANTSメモリプロファイラーを使用したアプリケーションのMemroyスナップショット

小さな二重配列もこれの影響を受けます(配列内の70要素のみ)

4

1 に答える 1

4

double の配列を LOH に配置するためのしきい値サイズは、他の型よりもはるかに低くなります。この理由は、LOH の項目は常に 64 ビットでアラインされており、double は 64 ビットでアラインされていることから大きな恩恵を受けるためです。

これは、32 ビットで実行されているプログラムにのみ影響することに注意してください。64 ビットで実行されるプログラムには、常に 64 ビット境界に配置されるオブジェクトがあるため、64 ビット プログラムでは LOH ヒューリスティックは使用されません。

しきい値サイズは 1000 double です。

https://connect.microsoft.com/VisualStudio/feedback/details/266330/も参照してください。

于 2012-08-03T09:06:22.450 に答える