収集時に、ガベージ コレクターはすべてのライブ オブジェクトを別のメモリ空間にコピーし、プロセス内のすべてのガベージ オブジェクトを破棄します。新しいスペースにコピーされたオブジェクトへのフォワード ポインターは、オブジェクトの「古い」バージョンにインストールされ、コレクターがオブジェクトへの残りのすべての参照を正しく更新し、同じオブジェクトを誤って 2 回コピーしないようにします。
これは明らかに、ストップ・ザ・ワールド・コレクターにとって非常にうまく機能します。ただし、stop-the-world では一時停止時間が長いため、現在、ほとんどのガベージ コレクターはミューテーター スレッドがコレクターと同時に実行されることを許可し、ミューテーターを短時間だけ停止して初期スタック スキャンを実行します。
では、コレクターは、オブジェクトの「古い」バージョンが、コピー中/コピー後にミューテーターによってアクセスされないようにするにはどうすればよいでしょうか? ミューテーターは何らかの読み取りバリアを使用してフォワード ポインターをチェックできると思いますが、変数が頻繁に読み取られるため、これはコストがかかるようです。