Slide 24
Slide 24 text
Tri-color Marking - Go
言語のGC
並行マーキングを実現する三色アルゴリズム
白 (White)
未探索・回収候補
灰 (Gray)
探索中・参照先未確認
黒 (Black)
探索完了・生存確定
回収
白のまま→解放
Step 1:
初期状態
Root
A B C
D E
全オブジェクトが白(未探索状態)
Step 2:
ルートから開始
Root
A B C
D E
ルートから到達可能な A, B を灰色に
Step 3:
灰色を処理
Root
A B C
D E
A→E, B→Cの参照先を灰色に / A, B自身を黒に変更
Step 4:
完了
Root
A B C
FREE E
灰色なし → マーキング完了
白が残っていれば回収対象
🔄 並行実行の
仕組み
• Mutator(アプリ)とGCが並行動作
• Write Barrierで参照変更を追跡
• STWは最小限に抑制
• Go 1.5以降で採用
⚡ Go
言語の
最適化
• Goroutine統合GCスケジューリング
• ペーシング: メモリ基準でGC起動
• アシスト: MutatorがGC支援
• 目標: GC停止時間を10ms以下に
✅ 特徴とトレードオフ
利点: レイテンシ低、リアルタイム向き
コスト: Write Barrierオーバーヘッド
リソース: CPUコア1つをGC専用に
メモリ: フットプリントやや大
📝 Write Barrier
(書き込みバリア)の役割
並行GC中にアプリがポインタを書き換えた場合、GCが見落とさないように通知する仕組み
例: 黒オブジェクトAが新たに白オブジェクトFを参照 → Write BarrierがFを灰色に変更し、GCの探索対象に追加
これにより、並行実行中でもオブジェクトの見落とし(Lost Update
問題)を防止する
※ 参照関係: Root → A, B / A → E / B → C / D はどこからも参照されていない(到達不能)