すべての新しい割り当て (ラージ オブジェクトを除く)は常にGen0 で行われるため、GC は指定された世代以下から常に収集するように設計されています。を呼び出すとGC.Collect(2)
、GC に Gen0、Gen1、および Gen2 から収集するように指示されます。
多くの大きなオブジェクト (割り当て時に LOH に配置するのに十分な大きさのオブジェクト) を扱っていることが確実な場合は、完了時にそれらを null (VB では Nothing) に設定することをお勧めします。彼らと。LOH 割り当ては、スマートでブロックを再利用しようとします。たとえば、LOH に 1MB のオブジェクトを割り当て、それを破棄して null に設定すると、1MB の「穴」が残ります。次に LOH に 1MB 以下のサイズのものを割り当てると、その穴が埋められます (そして、次の割り当てが大きすぎて残りのスペースに収まらないまで穴を埋め続けます。新しいブロック。)
.NET の世代は物理的なものではなく、GC のパフォーマンスを向上させるための論理的な分離であることに注意してください。新しい割り当てはすべて Gen0 に行われるため、常に最初の世代が収集されます。実行されるコレクション サイクルごとに、下位世代でコレクションを生き残ったものはすべて、次に上位の世代に "昇格" されます (Gen2 に到達するまで)。
ほとんどの場合、GC は Gen0 の収集を超える必要はありません。GC の現在の実装では、Gen0 と Gen1 を同時に収集できますが、Gen0 または Gen1 の収集中に Gen2 を収集することはできません。(.NET 4.0 ではこの制約が大幅に緩和され、ほとんどの場合、GC は Gen0 または Gen1 も収集されている間に Gen2 を収集できます。)