- SlideBoom

mrubyの
Tri-color incremental mark & sweep GC
その1
GC Advent Calendar 23日目
オブジェクトは3種類の以下の色に分けれられます
白: マークされていない
灰: オブジェクト自体はマークされているが子供はマークされていない
黒: オブジェクト自体、子供もマーク済み
Incremental GCの基本的な
動きを見てみる
1. root scan phase
roots
ルートから直接参照可能なところを灰色に
このフェーズでは、ミューテータ(アプリケーション側)は
オブジェクトの参照構造を変えられない。
2.incremental marking phase
roots
灰色のオブジェクトから
順に塗っていく
適当な数だけ塗ったらGCは休憩。
ミューテータの処理が走る。
2.incremental marking phase
roots
ああっ、黒->白ができてしまった。
(黒なのに子供がマークできてない状態はまずい)
でもライトバリアがあるから大丈夫!
ライトバリア
ククク、参照関係を
変更してやる
ミューテータさん
ライトバリアによって黒->白への参照が書きこまれた場合は白は灰色に塗られる
(ちなみにmrubyでは2種類のライトバリアを持っている、後述する予定)
2.incremental marking phase
ミューテータが止まって、GC再開
roots
3.incremental sweep phase
roots
白色をスイープ、適当な数をこなしたらまたしてもGC休憩
3.incremental sweep phase
roots
でも、マーキングが一度おわってしまえば、参照関係
を変更されるのはあまり影響がない。
どうせ全部黒だからな。フハハハ。
(実はまずいケースもあるのだが、これも後述する)
ククク、参照関係を
変更してやる
ミューテータさん
3.incremental sweep phase
roots
またGC再開。白色をスイープし終わる。
これでおしまい。
次回はスイープをインクリメンタル
にしている工夫をまとめてみる