ガベージコレクションのアルゴリズムと実装 5,6章
ustの進みに合わせて毎週読みます。
http://www.ustream.tv/recorded/6018251
Shinichi Tokunaga
@deepneko
通常のマークスイープによるマークフェーズ → ヒープ領域をスキャンしてコンパクションすることでオブジェクトの詰めなおしをする。
2010-04-10 08:00:16
Shinichi Tokunaga
@deepneko
コンパクションするのでオブジェクトのヘッダに移動先を示すポインタが必要です(forwardingポインタ)
2010-04-10 08:02:33
Shinichi Tokunaga
@deepneko
オブジェクトを探索するポインタ(scan)、移動先を指すポインタ(new_address)の2つのポインタを用意します。
2010-04-10 08:33:33
Shinichi Tokunaga
@deepneko
ヒープ領域を探索して、scanポインタが生きてるオブジェクトを見つけたら、scan中のオブジェクトのforwardingにnew_addressを設定して、new_addressはオブジェクトのサイズ分進めます。
2010-04-10 08:35:07
Shinichi Tokunaga
@deepneko
コピーGCだとFrom空間とTo空間がありましたが、マークコンパクトGCの場合はコピー先コピー元が同じ空間なので、forwardingポインタを新たに設けておく必要があるのです。
2010-04-10 08:36:38
Shinichi Tokunaga
@deepneko
ヒープをスキャンして生きているオブジェクトの子オブジェクト全てにたいしても*child = (*child).forwarding
2010-04-10 08:49:44
Shinichi Tokunaga
@deepneko
new_address = scan.forwarding → copy_data → new_address.forwarding = NULL → new_address.mark = FALSE → $free += new_address.size
2010-04-10 08:58:59
Shinichi Tokunaga
@deepneko
つまり、forwarding先に実際にコピー → forwardingポインタとマークビットは初期化しておきましょう。 → フリーリストのポインタも進めておきましょうね。
2010-04-10 09:03:52
Shinichi Tokunaga
@deepneko
心配無用。コピー先となるヒープ領域には、この先でコピーしようとしてる生きてるオブジェクトは存在しないよ。
2010-04-10 09:05:46