[Yarv-devel] GC Tech. on Script Lang.
MAEDA Atusi
maeda-yarv @ atusi.org
2004年 2月 7日 (土) 10:05:02 EST
matz at ruby-lang.org (Yukihiro Matsumoto) writes:
> ささださんの推測で当たりです。
>
> * あるスレッドで生成したオブジェクトは全部スレッドごとのテー
> ブル(registry)に登録
>
> * ヒープから参照されたオブジェクトにはwrite barrierでマー
> クをつける
>
> * テーブルがいっぱいになるかフリーリストが空になるとminor GC
> + ローカル変数とCスタックから参照されているオブジェクト
> に(上記とは別の)マークをつける
> + テーブルをスキャンして、ヒープからの参照マークも、ロー
> カルからの参照マークも付いてないものはゴミ。回収。
>
> * minor GCで回収したオブジェクトが十分になかったりすると、
> major GC。たぶん全スレッドを止めてmark and sweep。あるい
> はdirty bitを使ったconcurrentなものにする余地もありま
> すが、そこまですることはないかなと。
>
> というイメージです。あ、せっかく引っ張ってたのに書いちゃった (苦笑)
なるほど。少し抽象的に書くと、
・あるスレッドで生成したオブジェクトは「スレッドローカルなオブジェクト
の集合」に加える。
・ヒープから参照されるとその集合から除く。
・minor GCでは、ローカル変数/スタックから直接参照されていないものを除
く。残りはゴミ。
という感じですか。「ローカル集合」の実装は、「registryに入っていてかつ
『ノンローカル』マークがついていない」で表す。(マークを分けるのは、回
収時にマークをクリアするかどうかの違いですかね。)
前田敦司
Yarv-devel メーリングリストの案内