2007年04月01日

copying GCに対する改良

前回の記事ではcopying GCを取り上げた。今回はその続きとしてcopying GCに対する改良を2つ取り上げる。

2つはそれぞれcopying GCの短所、つまり「毎回全てのオブジェクトがコピーされること」「確保したメモリの半分しかプログラムで利用できないこと」に対応している。

大きい、または長命なオブジェクトの別扱い

copying GCは生き残るオブジェクトを毎回全てコピーするので、オブジェクトが短命でかつ小さい程都合がよい。裏を返すとオブジェクトが大きかったり長命だとコストが嵩む。

そこで、そのようなオブジェクトは別領域にとりmark & sweepで管理することにして、copying GCの対象からは外してしまう。

アルゴリズム

コンパクションの際に、ポインタがmark & sweepで管理されるオブジェクトを指す場合はマークも同時に行う。

ポインタのとりえる値は次の3種類に分けられる。

  1. from-spaceにあるコピー前のオブジェクトを指す場合
  2. from-spaceを指すがオブジェクトは既にコピーされていた場合
  3. mark & sweepで管理するオブジェクトを指す場合

それぞれに応じて処理は次のようになる。

  • from-space内のコピー前のオブジェクトを指す場合:
    1. to-spaceにコピー、freeポインタを進める
    2. forwarding pointerを記録
    3. ポインタを更新
  • from-space内を指すがオブジェクトが既にコピー済の場合:
    1. ポインタを更新
  • mark & sweep対象のオブジェクトを指す場合:
    1. そのオブジェクトをマークし、オブジェクト内のポインタを再帰的に処理。

ポインタの種類も3種類、ルートポインタ、to-spaceにコピーされたオブジェクト内のポインタ、markされたオブジェクト内のポインタ、とあるが、どの場合も処理は同じになる。

マークを兼ねたコンパクションが終わったら、mark & sweepの領域の回収処理を行う。

続きを読む

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。