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