ガベージコレクタのアルゴリズムと実装(アルゴリズム編)のメモ

一章
ガベージコレクタの評価項目
スループット
・停止時間
・使用効率
・局所性

二章
マークスウィープはメモリ全体を舐める
フラグメントがたまる
→BiBOP法(BigBagOfPages)
      phkmallocみたいなやり方
チャンク検索のコストが上がる
→サイズ別チャンク

単純なやり方ではコピーオンライトと仲が悪い
→ビットマップマーキング

遅延スウィープ
・全体を舐めなくて良い

三章
遅延参照カウント
・普段はルートからの参照をカウントしないが開放要否の判断時にカウントアップして帳尻を合わせる
スティッキー参照カウント
・カウントアップ式マークスウィープをへいようしてhappy
1ビット参照カウント
部分マークスウィープ
デリファレンス時に子孫オブジェクトのリファレンスカウント分を差し引いてみて自分に帰ってきたら循環判定。ゼロなら抹殺

四章
普通のコピーGC
・再帰アルゴリズムで深さ優先
cheneyのアルゴリズム
・反復的で幅優先
擬似的深さ優先アルゴリズム
・近いものを近くに置ける

五章
コンパクションは空間効率がいいが時間効率が悪い
BiBOPとtwofingerを併用するアイディア
テーブル法
・連続オブジェクトをオフセットを使って管理する
・フォワードポインタが不要
immixGCは一旦飛ばす

六章
保守的GCには
・不明瞭なルート
・不明瞭なオブジェクト
の2つがある
前者は
・間接参照
・mostly copied
・ブラックリスト
で確実なGC相当のコピーGCを(リークを許容しながら)実現できる
後者はオブジェクトを移動できずマークスウィープ以外の選択肢はない

七章
Rememberセットには参照元を登録する
ライトバリアで旧世代ポインタの変更を拾うと実装しやすい
trainGCは一旦飛ばした

八章
Dijkstra 参照更新時、新しい参照先が未クロールならグレー(クロール対象)に塗る
Steele クロール済みオブジェクトに修正が入ったら再クロールの対象にする
Yuasa マーク開始時のリンクでマークし、ライトバリアでは旧オブジェクトをこぼさないように差分をフォローする。