[Yarv-devel] GC Tech. on Script Lang.

MAEDA Atusi maeda-yarv @ atusi.org
2004年 2月 8日 (日) 08:39:40 EST


matz at ruby-lang.org (Yukihiro Matsumoto) writes:

> |という感じですか。「ローカル集合」の実装は、「registryに入っていてかつ
> |『ノンローカル』マークがついていない」で表す。
> 
> その通りです。
> 
> |マークを分けるのは、回収時にマークをクリアするかどうかの違いですかね。
> 
> これまたご推察の通りです。なんか穴がありそうな気がして不安な
> んですが。

minor GCとして正しく動くという意味では大丈夫そうに思います。ヒープを介
さずに他のスレッドに参照が渡るようなことがなければ、ですが。

「ローカル集合」の表現にはバリエーションが考えられますが、固定長の配列
と2つのマークビットというのは妥当な気がします。

こんな感じですかね。

  sweep_local(Thread t)
  {
    int used = 0, scanned, n = t->local_objects_num, bytes = 0;
    for (scanned = 0; scanned < n; scanned++) {
      Object o = t->local_objects[scanned];
      if (is_referenced_from_heap(o)) {
        continue; // Remove from the set.
      } else if (is_referenced_locally(o)) {
	clear_local_mark(o);
	t->local_objects[used++] = o;
      } else {
	bytes += o->bytes;
	finalize_and_reclaim(o);
      }
    }
    if (bytes < threshold) {
      global_gc();
      used = 0;
    }
    t->local_objects_num = used;
  }

うーむ。有効かどうかはやってみないと分からないなあ。Rubyではヒープに書
き込まれないまま死ぬオブジェクトがJavaより多い、なんてことがあれば有望
かも。

				前田敦司


Yarv-devel メーリングリストの案内