多くの小さなオブジェクトと配列を割り当てる C# コンソール アプリケーションがあります。これらのオブジェクトの有効期間は短く、ガベージ コレクターによってすぐにクリーンアップされます。「なぜそんなに短い寿命のオブジェクトを割り当てる必要があるのか 、これを避けるべきです」という質問に対して:プログラムは重いAIタスクに使用されており、今のところこれを回避する明白な方法はありません.
問題は次のとおりです。
プログラムをデバッグ モード x86 で実行すると、問題なく実行され、数分後にすべての処理が終了します。平均して、300 ~ 400 MB を使用します。
まったく同じプログラムをコンパイルしてリリース x86 モードで実行すると、プログラムが使用するメモリがすぐに (数秒で) 2GB に達し、スローOutOfMemoryException
されます (これは 32 ビット アプリケーションであるため、予想される動作です)。リリース x64 モードでコンパイルしても問題はまったく解決しません。コンピュータのすべてのメモリ (8GB) をすぐに使い果たし、メモリの割り当てに失敗するとクラッシュします。
アプリケーションのビルドには SharpDevelop 4.3.3 を使用しています。デバッグ モードとリリース モードの唯一の違いは次のとおりです。
- コードの最適化 (リリースのみ)
- 算術オーバーフロー/アンダーフローのチェック (デバッグのみ)
- デバッグ情報 : 完全なデバッグ情報 (デバッグ) / デバッグ情報なし (リリース)
いずれの場合も、デバッガは接続されていません。プログラムはかなり短く、デバッグまたはリリースでコンパイルしたときに異なる動作をさせるコンパイラ ディレクティブはありません。動作を説明する明確な理由はありません。リリース モードでコンパイルすると、ガベージ コレクターが起動されず (または少なくとも十分な回数)、メモリが解放されないように見えます。
同様の質問がすでに出されているようですが、私のものと同じ問題ではないようです。