[ruby-dev:3528] Re: GC target (Re: [ruby-list:10035] Re: Ruby/Gtk text widget)
From:
"D.Kanda" <MAP2303@...>
Date:
1998-10-13 09:38:21 UTC
List:
ruby-dev #3528
かんだです。
matz@netlab.co.jp (Yukihiro Matsumoto)さんの書かれた、
「[ruby-dev:3527] Re: GC target (Re: [ruby-list:10035] Re: Ruby/Gtk text widget)」
からの引用です。
> まつもと ゆきひろです
>
> In message "[ruby-dev:3526] Re: GC target (Re: [ruby-list:10035] Re: Ruby/Gtk text widget)"
> on 98/10/13, "D.Kanda" <MAP2303@mapletown.net> writes:
>
> | かんだです
>
> | オブジェクトがどう保存されているのか知らないんですけれど、たぶん intern
> |をキーにして表形式のように考えられるんじゃないかと思います。
> なるほどね.そうだったら可能ですね.
> でも,残念なことに実際にはそうはなってないんですよ.
うーん、違ったか。
> rubyのメモリ管理機能はgc.cを見る必要があるんですが,rubyのオ
> ブジェクトは heaps という配列の配列の要素です.
gc.c は何回か挑戦しているんですけれど、難しいです。
勉強になります。
> [heaps....]
> |
> +->[heap....]
> |
> +->[heap....]
>
> heapのひとつの要素がオブジェクトになります.で,この要素への
> ポインタでオブジェクトを指しているわけです.たとえば
>
> &heaps[0][0]
>
> はヒープの先頭にあるオブジェクトですね.ですから,keyからオ
> ブジェクトへの表のようなものは存在しないんです.変数は大域変
> 数,インスタンス変数,定数,ローカル変数それぞれに異なる形式
> でテーブル(のようなもの)を持っています.
>
> GCはどうしているかというと,以下のルートから再帰的にたぐれる
> オブジェクトにマークを付けて(mark phase),マークのついていな
> いオブジェクトを回収(sweep)しています.
gc_gc() ですね。なるほど。
で、sweep はこんな感じになってるわけですね。
for (i=0; i < heaps.size; i++) {
for (j=0; j < heaps[i].size; j++) {
if (! heaps[i][j].isMarked())
obj_free(&heaps[i][j]);
}
}
> 落ちたのがGCの中でなければ,その時参照していたオブジェクト
> (またはその上流)のオブジェクトの保護忘れの可能性が高いです.
これはスクリプトのどこで落ちたかが分かる場合ですよね。見当がつけばなんと
かなります。
> GCの中の場合で落ちた場合には少々厄介で,gc_mark()を何段階か
> 遡って当たりをつける必要があります.
こっちの場合は、heaps から辿っている場合ですよね。これは結構ハマる。
この場合には i,j をキーにしたテーブルとはみなせないかしら。
> Cのスタック領域は「なにがポインタでなにが整数であるか」の情
> 報が存在しないので,「とりあえず全部ポインタとみなし,heapの
> 中を指しているものはオブジェクトの参照ということにする」とい
> う方針になっています.このようなGCを保守的なGC(Conservative
> GC)と呼びます.
保守的なGC というのはたまに耳にしますが、そういう意味でしたか。
# 革新的なGC は全てを整数とみなすのだろうか ← それじゃ役に立たないぞ ^^;
> フリーでない場合には…私とコンサルティング契約を結ぶと言うの
> はどうでしょう? お安くしておきます.^^;;;
業務で ruby を扱える日が来るといいのですが :)
# 趣味で作るのは全部フリーなので