exact GC と conservative GC
祝 Matz 日記復活。
exactなGCの方が性能的にやや有利だが、 一方、拡張ライブラリの書きやすさは 保守的GCの方がずっと楽である。
たとえば、Rubiniusはexact GCを採用しているため
- yieldを呼ぶメソッドをCで記述できない
- Cメソッド実行中のオブジェクトは自動的に殿堂領域に割り当てられる
など、Cでのメソッド定義にかなり制約がある。 まあ、ほとんどのメソッドをRubyで実装しようというRubiniusでなら 受け入れられる制約なのかもしれない。
Matzにっき(2008-06-23)
ここの説明がよく分からなかった。そうなのか。Evanの資料には『RubiniusではMRIのC APIと互換性のあるレイヤーを用意する』という説明があったけど、Cからyieldを呼べないのがほんとだとしたら難しそうだな。GC勉強しないと。
そういえば、Conservative GC は
- メモリ内容がヒープ領域を指すポインタっぽい値であれば、(仮にポインタじゃなくても) ポインタと見なす
- このため、どこからも参照されてないのに間違って「参照されている」と見なされてしまうことがある
- そのせいで、ほんとは解放できるはずなんだけど解放されない場合がある
というものだと思うけど (あってる?)、「解放されない場合がある」ことを「解放漏れがある」と表現したら、それはなんか違うというご指摘をいただいた。そうなのか? もうちょっと詳しく聞いとけばよかった。