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