[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 メーリングリストの案内