GCとポインタ

 いつGCが起きてオブジェクトを移動させられるか分からない状況で、ポインタの==を成功させるには、ポインタの位置だけは不変にしてやらないといけない。不変のポインタが実際のオブジェクトを指すので、クラスは実際はポインタのポインタになっているんだろう。オブジェクトの移動が起きたら対応するポインタを一発で書き換えられる。ポインタのサイズは同じなので連結リストアロケータが使えるから効率的だ。連結リストならサイズを自由に増減させられるから、領域が足りなくなったらG2領域の反対側から使っていけばいいんだろう。

 ただ全ての処理がネイティブより遅くなりそうだ。ハードウェアの魔法で解決してるんだろうか。

 オブジェクトの移動ののち、ポインタ書き換えを一発やるわけだがこれはアトミックな処理だ。しかし移動のためのコピーはアトミックでなく、コピー中に微妙なところを書き換えられると移動後と移動前で不整合が起きる。GCをなるたけ無停止でやろうとするなら、オブジェクトのロックが必要になるので、書き換えの時はロックする。さらに書き換えで参照してるオブジェクトを変えると生き死にが変わるので、オブジェクトの代入時には「新たに生きられるオブジェクトが増えましたよ」とGCに通知してやらなきゃいけない。この通知があったものを全部たどって生きられるオブジェクトにマークした後、通知を調べて、なければGCを開始できる。しかし通知があったらまた辿って、通知があったらまた辿ってを繰り返しているうちに、メモリが足りなくなることもあるかもしれない。この場合はもう実行を止めるしかない。

 これでだいたい無停止なGCが出来るように思うがどうなんだろうか。