操作して学ぶ

ガベージコレクション可視化

GCの根っこは「ルートから辿れるか(到達可能性)」です。 オブジェクトを割り当てたり参照を切ったりして、マーク→スイープでゴミが回収される様子を動かしてください。

横にスクロール

GCルートから参照をたどって到達可能なオブジェクトを残し、届かない循環参照を回収する流れ
GCはルートから到達できるかで生存を判定します。循環参照も外部から届かなければ回収できますが、不要なキャッシュが参照を保持している場合は到達可能なままなので、上限・期限・登録解除とヒープ計測が必要です。
ヒープ 6/12到達可能 3ゴミ 3
ROOTS012345

参照カウント方式なら残る循環ゴミ: 2(id: 3, 4 — 互いに参照し合いカウントが0にならない)

到達可能性ベースの mark & sweep は、こうした循環参照も「ルートから辿れない」ので回収できます。

GCの根っこの考え方は「ルート(スタック・グローバル)から辿れるか」=到達可能性です。 マークで到達可能を塗り、スイープで残り(=ゴミ)を解放します。実際の処理系はこれに世代別(若い世代を頻繁に・古い世代をたまに集める)や コンパクション・並行GCを重ねて停止時間を縮めています。すべてブラウザ内で計算。

押さえどころ

  • 到達可能性が生死を決める:ルート(スタック・グローバル)から辿れないオブジェクトは、参照が残っていてもゴミ。
  • 循環参照も回収できる:互いに参照し合ってカウントが0にならない循環は、参照カウント方式では漏れる。到達可能性なら「辿れない」ので回収できる。
  • 世代別GC:多くのオブジェクトはすぐ死ぬ(世代仮説)。若い世代を頻繁に、古い世代をたまに集めることで、毎回ヒープ全体を走査せず停止時間を縮める。