ガベージコレクションのアルゴリズムと実装 第12章「V8 の GC」その3
今日も「V8 の GC」のオブジェクト管理からです。
- Object クラスの子クラス HeapObject が GC のターゲット。Smi(Small integer)、Failure は即値
- HeapObject は Heap::Allocate() でアロケーションしてる。 C++ の new/delete を使うと VMヒープでなくネイティブのヒープを使ってしまうため
- VM ヒープは新世代、旧世代に分かれ、さらに旧世代はポインタ空間(参照ありのオブジェクト)、データ空間(参照なし)、マシンゴ空間(JIT)、Map 空間(型情報)、Cell 空間、巨大オブジェクト空間など種類で細かく分類されてる
- ハンドルスコープ。オブジェクトへのポインタのみハンドルスコープで管理されてる。ハンドルスコープはヒープに確保されてるので自動的に破棄される。C++ のテンプレートの威力
- 関数からオブジェクトへのポインタを返す時など呼び元のハンドラに格納される前にハンドラスコープが破棄されてしまうのは大丈夫なんだろうか?
- タグ付け。Smi が下位1ビット 0 というタグになってて Smi の演算などが高速になってる。そのかわりオブジェクトのポインタを使う時にタグを外さないといけない。
- オブジェクト内フィールド制御
- フィールドの位置を C++ にまかせずに自分で制御するという大変面倒なことをしている。しかしそれによってポインタのフィールドをまとめて高速にマークできるようになってる。
V8 のオブジェクト管理のところまで読みました。V8 は高速化のためにとても細かいところまで気を使ってたくさんの工夫が詰め込まれているという印象です。
明日はマークコンパクト GC のところです。