ガベージコレクションのアルゴリズムと実装 第12章「V8 の GC」その4

今日も「V8 の GC」のマークコンパクトGCのところからです

  • マークコンパクトGCが起動されるのは旧世代領域のフラグメンテーションが一定量に逹した時
    • つまり旧世代領域の空き容量を増やすためのGCはマークスイープGCが担っていてマークコンパクトGCは純粋にウラグメンテーション対策?
    • GC中は VMヒープがロックされアロケーションが止められる
  • コラムより、マークスイープの処理も MarkCompact クラスに書かれていてきもちわるいらしい
  • マークスタックを使って関数再帰せずにマーク処理
    • マークスタックは新世代 From 領域に確保する。メジャーGCはマイナーGC直後に実行されるので From は常に空
    • マークスタックがオーバフローしたら push すべきオブジェクトにオーバフローフラグを立てておく。そして後でマークスタックが空になったらヒープをスキャンしてフラグの立ったオブジェクトをあらためてマークスタックに入れて再度マーク処理
  • マークとオーバフローのフラグにはオブジェクトの先頭にある Map オブジェクトへのポインタの下位2ビットを流用する

やはり細かい工夫がおもしろいですね。