私は、ネットワークからメッセージを受信し、メッセージタイプに応じてそれらを異なるオブジェクトに変換し、最後にアプリケーションビジネスロジックを適用する金融C#アプリケーションを作成しています。リアルタイム.NETアプリケーションでガベージコレクションを回避するにはどうすればいいですか?
ビジネスロジックを適用した後、私はこのインスタンスを再び必要としないと確信しています。ガベージコレクタが解放するのを待つのではなく、明示的に「削除」したいと思います。
C#でこれを行うより良い方法は、オブジェクトのプールを使用して常に同じインスタンスセットを再利用するか、より良い戦略があるかどうかです。
時間の重大なプロセス中にCPUを使用するガベージコレクションを避けることを目標としています。
では、(a)所定のオブジェクトの作成が遅い、(b)32ビットアプリケーションの場合、メモリの断片化を減らすため、またはデータを使用する配列/リスト/ブロック> 64 KB、例えば要素あたり8K以上8B、要素あたり16K要素×4B。 .Net **は、毎回異なるサイズを要求すると、断片化したメモリにつながる可能性のある大きなブロック**を再配置(移動)しません。十分な大きさの要素を前面に配置し、それらを保持することはより安全です。 (ただし、使用していないときはフィールドをクリアするので、GCは指定したものを取り戻すことができます)。割り当てられたサイズを超える場合は、#要素を2倍します。 – ToolmakerSteve
極端なケースでは、(私は64ビットで動作しない依存関係のために)1つの32ビットアプリケーションを持っているので、メモリの断片化を避けるために、各サブリストが64 KBに収まるようにリストのリストを保持して、.Netが "ラージオブジェクトヒープ"に割り当てないようにします。したがって、アプリケーションの4 GBアドレス空間に大きな「穴」を作成するのではなく、GC中にメモリを「コンパクト」にすることができます。この特定のアプリケーションは、ネイティブ(非.NET)メモリからDirectXの割り当てを多く含んでいたため、問題がありました。 non.Netと.Netの割り当てが混在すると、断片化が発生しました。 – ToolmakerSteve