いいえ、ビットをゼロに設定しません。非常に簡単な説明では、
まず、ガベージ コレクターは、どのオブジェクトがアクセスできなくなったか (「到達不能」) ではなく、どのオブジェクトがまだアクセス可能または到達可能であるかを判断する必要があります。これは、すべてのオブジェクトルートを単純にリストすることによって行われます。ルートは、参照オブジェクト (ヒープ上のオブジェクト) へのポインターを含むメモリの場所です。次に、再帰的に、ルートによって参照されるすべてのオブジェクト、または既に到達可能としてフラグが設定されているオブジェクトのフィールドまたはプロパティによって参照されるすべてのオブジェクトに「到達可能」としてフラグを立てます。
根には4種類あります。
- 参照オブジェクトを含む静的変数
- 現在アクティブなスレッドのスタック上のオブジェクトを参照します。
- メソッド パラメータの参照型
- CPU レジスタが指すオブジェクトを参照します。
App Domain 内の任意のコードから引き続きアクセスできる (到達可能な) 参照オブジェクトを特定した後、まだ到達可能なすべてのオブジェクトを取得し、それらの間の物理メモリにギャップがある場合は、それらの一部を移動して「最適化」します。それらがすべて連続するように、「終了」または「使用済み」メモリを表すポインタを、この新しい圧縮された最適化されたリストの最後に設定します。新しくインスタンス化されたオブジェクトのすべての新しいメモリ割り当ては、このポインタ位置の直後のメモリから割り当てられます。
到達可能なオブジェクトが使用するメモリにギャップがない場合は、ポインタをリスト内の最後の到達可能なオブジェクトの最後にリセットするだけです。