Gauche > Archives > 2011/07/10

2011/07/10 00:21:15 UTCenami
#
上の話は boehm gc だとうまく解決されるんでしょうか?どちらも保守的 gc なのだからあまり変わらないような。
2011/07/10 02:50:41 UTCshiro
#
Boehmだから、というよりもポイントは、「GCによりアロケートされたオブジェクト」が「GC外でアロケートされたオブジェクト」を指すケースを出来る限り減らす、という点にあります。自前GCでもBoehmと同様、全てのメモリチャンクのアロケーションを追跡していれば問題は小さいです。
#
けれども、簡単なGCでは、GCにより直接アロケートされるメモリチャンクの形式を限定するものがあります。正確には、ポインタを見たときに、それがGC allocされたものだと認識されるようなポインタに制限がある、といった方がいいかな。
#
例えば、GC allocされるオブジェクトを固定長ヘッダとそこから指される可変長領域って形式にしといて、GC管理オブジェクト用に固定長ヘッダの配列を用意しておき、GC allocはヘッダをひとつ持ってきて、可変長領域をmallocしてヘッダから指す、という方式。
#
GC markフェーズでは、固定長ヘッダ領域の要素の先頭を指す(ように見える)ポインタを認識して、そのヘッダを持つオブジェクトが生きていると判断する。
#
これだと、固定長ヘッダから指される可変長領域の方を直接指してるポインタは生きてるオブジェクトのカウントに寄与しないため、今回の話題に出ているような問題が生じます。
#
Boehmのように可変長領域も全て追跡すれば (更に、可変長オブジェクトの「途中」をさしているポインタも認識してそのオブジェクトを生かすようにすれば) 危険はぐっと減ります。
#
でもそれをやるのはかなり面倒。
2011/07/10 03:51:17 UTCenami
#
全部 boehm gc 経由で確保しているかそうでないかが違い、ということですか。
2011/07/10 03:55:18 UTCshiro
#
そゆことです。自前GCでも同じように全てのアロケーションを直接トラックしてれば良いわけです。
2011/07/10 05:11:38 UTCko1
#
パフォーマンス的にはどっちが有利なのか,昔から比較しようと思っていて,チェックできていません....
2011/07/10 05:59:35 UTCshiro
#
どうなんでしょうね。管理の手間は(可変長部分のアロケーションも含めて考えれば)似たようなものだと思いますが、Boehmでオブジェクト内部を指すポインタも有効にした場合はfalse positiveが増えるので、回収効率は悪くなるかも。