【マークアンドスイープ】

マーク&スイープ とは?

最終更新:
💡 たどれるものに印を付け、残りのメモリを回収

ルートから参照をたどって到達できるオブジェクトに印を付け、印のないオブジェクトのメモリを再利用可能にするガベージコレクションの基本方式。

📌 このページのポイント
マーク&スイープ:到達できるかで判断 ① マーク ② スイープ ルート A ✓ B ✓ 参照を たどる D E 到達不能な循環 A B マークあり → 残す D・Eの領域 再利用可能 残したA・Bを移動させる処理とは別
矢印は参照を表します。基本のマーク&スイープでは、残すオブジェクトを詰め直す必要はありません。処理中の停止や並行実行の方法は実装によります。
ひよこ ひよこ
マーク&スイープって、お掃除の名前みたい!
ペンギン先生 ペンギン先生
メモリを整理する方法の一つだよ。まず参照をたどれるオブジェクトに印を付けるのがマーク。次に、印が付かなかったオブジェクトの領域を再利用可能にするのがスイープなんだ。
ひよこ ひよこ
参照はどこからたどるの?
ペンギン先生 ペンギン先生
ルートと呼ぶ出発点からだよ。実装によるけれど、グローバル変数や、実行中の処理が保持する参照などが手がかりになる。そこからA、AからBと参照がつながっていれば、AもBも残すんだ。
ひよこ ひよこ
使う予定がなくても、参照が残っていたら?
ペンギン先生 ペンギン先生
到達できれば残るよ。GCが判断するのは、将来の業務で本当に必要かではなく、参照をたどれるか。不要なオブジェクトを長く参照し続けると、GCがあってもメモリ使用量が増える原因になるんだ。
ひよこ ひよこ
AとBがお互いを参照していたら回収できない?
ペンギン先生 ペンギン先生
その二つへルートから到達できなければ、マーク&スイープでは回収できるよ。単純な参照カウントだけだと互いへの参照が残ってしまうけれど、ルートからたどる方式なら、到達不能な循環も見つけられるんだ。
ひよこ ひよこ
回収している間は、プログラムがずっと止まる?
ペンギン先生 ペンギン先生
単純な実装では止めて処理するけれど、方式の名前だけで停止時間は決まらないよ。たとえばGoのGCは多くの作業をアプリと並行して進めつつ、一部で短い停止を入れる。特定の停止時間を、すべてのプログラムに保証するものではないんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「マーク&スイープ」って出てきたら「参照をたどれるものに印を付け、残りを回収するGCの方式」と思えばだいたいOK!
📖 おまけ:英語の意味
「Mark-and-Sweep」 = 印付けと掃き掃除
💬 「mark(印を付ける)」してから「sweep(掃く)」という2ステップがそのまま名前になっているよ

参考資料

← 用語集にもどる