ガベージコレクションのアルゴリズムと実装 第3章「参照カウント(Reference Counting)」後半

ガベージコレクションのアルゴリズムと実装

ガベージコレクションのアルゴリズムと実装

今日は第3章の後半を読みました。

  • 1ビット参照カウント
    • 1ビットだけで参照数をカウント(1 or 2以上) 「ほとんどのオブジェクトはすぐ回収できる一時的なオブジェクトで参照が共有されない」ということらしい……
    • アドレスがアライメントされていることによるポインタの下位ビットの空きを利用する
    • キャッシュミスが起きにくく、メモリ使用量が少ない
    • Sticky参照カウント同様2つ以上の参照があるオブジェクトの回収が問題
  • 部分マークスイープ法(Partial Mark & Sweep)
    • マークを参照の削除時に実行して、生きているオブジェクトをマークするのではなくて死んでいるかもしれないオブジェクトを探すために利用する。これを使って循環参照しているかもしれないオブジェクトをキューに入れておいてマーク&スイープで解放
    • 循環参照しているオブジェクトをうまく解放できる
    • オブジェクトのスキャンを3回(グレーに塗る、白に塗る、白を解放する)も実行しないといけないので時間がかかり、参照カウント法なのに最大停止時間が長くなってしまう

部分マークスイープ法はちょっと複雑ですけど賢いアルゴリズムですね。それでもパフォーマンスを考えると完璧ではないみたいで、GC は実に奥が深いです。