マーク・アンド・スイープ

マーク・アンド・スイープ（）は、ガベージコレクションの実装方法およびガベージコレクタの動作方法の一つ。
方法.
基本的な方針は、あるオブジェクト（ここでは、ルートオブジェクトと呼ぶ）からのトラバース（オブジェクトから別のオブジェクトへの参照を辿ること）によって到達可能なオブジェクトに印（マーク）をつけ、印のつかなかったオブジェクトを破棄（スイープ）する、というものである。
具体的な手順の一例は次のようになる：
特徴.
マーク＆スイープ方式は、参照カウントにおける循環参照問題を回避し、不要なオブジェクトを確実に破棄できる。また、参照カウントを使わない分、ガベージコレクタが動作していない間の処理は高速である。
反面、ガベージコレクション自体は、参照カウント方式より処理時間がかかるため、通例次のような適当なタイミングを見計らって時々行う。
参照カウントによるごみ集めをメインに、マーク＆スイープなどを補助的に併用するシステムや、世代別ガベージコレクションのようにコピーGCとマーク＆スイープを組み合わせる方式もある。
保守的なガベージコレクタ.
C言語やC++言語など、ガベージコレクタを仕様に含んでいないプログラミング言語でマーク・アンド・スイープを実行するには、マシンスタックやマシンレジスタ内にも参照がないかを確認する必要がある。しかし、通常マシンスタックやマシンレジスタの値が参照アドレスを表しているのか、ただの数値を表しているのかを区別することはできない。そこで、マシンスタックやレジスタ中の値は全て参照アドレス値であると解釈して、該当アドレスのオブジェクト回収を保留する。このような実装を保守的なガベージコレクタと呼ぶ。処理手順は以下のようになる。
Boost C++ライブラリのcodice_2など参照カウント方式のメモリ管理とは異なり、保守的なガベージコレクタでは、特定のライブラリやネイティブスレッドとの同時使用によりトラブルが起こることがあるので、注意が必要である。