すべての新しい割り当て(ラージオブジェクト以外)常にがGen0に入るため、GCは常に指定された世代以降のものを収集するように設計されています。 GC.Collect(2)
に電話すると、Gen0、Gen1、Gen2から収集するようにGCに指示します。
大量のオブジェクト(割り当て時にLOH上に配置するのに十分な大きさのオブジェクト)を扱っていることが確実な場合は、それらをnull(VBではNothing)に設定することをお勧めします。あなたがそれらと一緒に完了したとき。 LOH割り当てはスマートでブロックの再利用を試みます。たとえば、LOHに1MBのオブジェクトを割り当てて廃棄し、それをnullに設定した場合、1MBの「穴」が残っています。次回、1MB またはそれより小さいサイズののLOH上に何かを割り当てると、それはその穴を埋めるでしょう(そして、次の割り当てが大きすぎて残りのスペースに収まらないうちにそれを埋めるでしょう。新しいブロックを割り当てます)。
.NETの世代は物理的なものではありませんが、GCのパフォーマンスを向上させる論理的な分離です。新しい割り当てはすべてGen0に入っているので、それは常に収集される最初の世代です。実行される各収集サイクルでは、収集を生き延びた低い世代のものは次の世代に「昇格」されます(Gen2に達するまで)。
ほとんどの場合、GCはGen0の収集を超える必要はありません。GCの現在の実装はGen0とGen1を同時に収集できますが、Gen0またはGen1が収集されている間はGen2を収集できません。 (.NET 4.0ではこの制約が大幅に緩和され、ほとんどの場合、Gen0またはGen1も収集されている間にGCはGen2を収集することができます)。
なぜあなたはこれをやりたいのですか?つまり、gen 0または1から収集しないでください。 .NET GCは、それ自身のデバイスに残すと最適に動作します。 – thecoop
私はそれを認識しています。基本的には、集中的な操作であるため、手動でGCを強制的に実行する必要はありません。それ以来、GCを実行する必要があるときは、完全なGCを実行するのではなく、特定の世代に対してのみ実行したいと考えています。私はGCの使用についてより具体的にしようとしています。それは私に任せません。 – DevinB