@AdamHouldsworthの提案は非常に良いものです。メモリリークに直面している可能性があります(古いオブジェクトへの参照はまだ保持されており、Adamが提案したように、ライブイベントサブスクリプションによって非常に頻繁に保持されます。これにより、ガベージコレクションが防止されます)。
@mkimesの回答も非常に価値があります。実際、64ビットプロセスとして実行すると、アプリケーションでより多くのメモリを管理できるようになりますが、それでもいくつかの注意点があります(単一オブジェクトのサイズの2GBの制限など)。
アプリケーションのメモリが不足してはいけないと直感的に感じる場合は、作成されたオブジェクトのほとんどが短命であり、破棄されているはずであるため、メモリリークが発生している可能性があります。ただし、プロセスが大量のオブジェクトを構築している場合は、プロセスの終了後または計算の長いフェーズ中に存続する必要があります。特に、フルの間にそれを考慮すると、32ビットのメモリ制限の障壁にぶつかる可能性があります。ガベージコレクションサイクルでは、アプリケーションのメモリは一時的に現在割り当てられているサイズの2倍近くになり、実際の32ビットメモリサイズの制限は約1GBに保たれます。
32ビットアプリケーションが処理できるメモリサイズを3GBに増やすことができるWindows構成スイッチがありますが、私の経験では、これによりオペレーティングシステムが不安定になり(非常に頻繁なブルースクリーン)、このオプションを慎重に検討してください。
メモリリークが疑われる場合:
この記事は役立つかもしれません。Windgb(高度なデバッガー)を使用して、不要な古い参照を存続させている可能性のあるオブジェクトをトレースする方法を示します。
また、(希望しないでください)、CLRが「大きなオブジェクト」と見なすもの、つまりサイズが85,000バイトを超えるオブジェクトを繰り返し頻繁に割り当てることによって引き起こされる可能性がある、メモリの断片化という非常に厄介な問題の犠牲になる可能性があります。これが問題の詳細を記した記事です。基本的に、このようなオブジェクトは、破棄される別のヒープの下に割り当てられますが、残念ながら、圧縮されることはありません。これは、解放されたメモリブロックに割り当てられたブロックが散在し、ランタイムがメモリ要求を満たすための単一の連続したメモリブロックを検出できず、メモリ不足例外がトリガーされる可能性があることを意味します。この場合、大きなモノリシックオブジェクトを小さなオブジェクトに分割すると役立ちます。
最後に、 64ビット未満でも2GBを超えるサイズのオブジェクトはあり得ないため、コレクションや配列がこの制限に達していないことに注意する必要があります。