操作して学ぶ
ガベージコレクション可視化
GCの根っこは「ルートから辿れるか(到達可能性)」です。 オブジェクトを割り当てたり参照を切ったりして、マーク→スイープでゴミが回収される様子を動かしてください。
横にスクロール
ヒープ 6/12到達可能 3ゴミ 3
参照カウント方式なら残る循環ゴミ: 2 個(id: 3, 4 — 互いに参照し合いカウントが0にならない)
到達可能性ベースの mark & sweep は、こうした循環参照も「ルートから辿れない」ので回収できます。
GCの根っこの考え方は「ルート(スタック・グローバル)から辿れるか」=到達可能性です。 マークで到達可能を塗り、スイープで残り(=ゴミ)を解放します。実際の処理系はこれに世代別(若い世代を頻繁に・古い世代をたまに集める)や コンパクション・並行GCを重ねて停止時間を縮めています。すべてブラウザ内で計算。
押さえどころ
- 到達可能性が生死を決める:ルート(スタック・グローバル)から辿れないオブジェクトは、参照が残っていてもゴミ。
- 循環参照も回収できる:互いに参照し合ってカウントが0にならない循環は、参照カウント方式では漏れる。到達可能性なら「辿れない」ので回収できる。
- 世代別GC:多くのオブジェクトはすぐ死ぬ(世代仮説)。若い世代を頻繁に、古い世代をたまに集めることで、毎回ヒープ全体を走査せず停止時間を縮める。