最終更新:
author_nari 2008年11月04日(火) 00:12:49履歴
ヒープの先頭から詰めていく、もっとも素朴なアルゴリズム
1.マーク
rootを走査し、生きているオブジェクトに印を付ける。
2.移動先の計算
上図のようにliveポインタでオブジェクトを見つけ、オブジェクト内に持っているforwarding pointerに移動先を書き込んでおく。
その後、freeポインタはオブジェクトのサイズの分だけ移動する。
liveポインタがHeapの最後に到達したら終了。
3.ポインタ更新
オブジェクトを参照しているすべてのポインタをオブジェクト内にもっているforwarding pointerで書き換る。
4.移動
実際にforwarding pointerの通りに移動して、Compactionを終了とする。
なぜ後で移動するのか?最初に移動すればいいのにと考えたが、
オブジェクトを参照しているポインタとforward_pointerを結びつけるものが、
その実際のオブジェクトしかない為、移動する事ができない。
1.マーク
rootを走査し、生きているオブジェクトに印を付ける。
2.移動先の計算
上図のようにliveポインタでオブジェクトを見つけ、オブジェクト内に持っているforwarding pointerに移動先を書き込んでおく。
その後、freeポインタはオブジェクトのサイズの分だけ移動する。
liveポインタがHeapの最後に到達したら終了。
3.ポインタ更新
オブジェクトを参照しているすべてのポインタをオブジェクト内にもっているforwarding pointerで書き換る。
4.移動
実際にforwarding pointerの通りに移動して、Compactionを終了とする。
なぜ後で移動するのか?最初に移動すればいいのにと考えたが、
オブジェクトを参照しているポインタとforward_pointerを結びつけるものが、
その実際のオブジェクトしかない為、移動する事ができない。
- forwarding pointerの余分な領域がオブジェクトに必要になる
- TwoFingerは「マーク、移動、ポインタ更新」の3パスだが、このアルゴリズムでは「マーク,移動先の計算、ポインタ更新、移動」の4パスが必要であり、遅い
- カテゴリ:
- パソコン
- ガーベッジコレクタ(GC)
このページへのコメント
筝荅宴障荐篋с 若若若若 http://www.fetang.com/