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