RubyGCメモ

今のGCは良くも悪くもない。
なのですごく悩む。
 
Mark and Sweepであるということ
発生する処理
毎回Markの処理が走る
 ルート(レジスタ、スタック等)の走査、マーク
Sweepの処理が走る
 Heap領域全走査、不要オブジェクトの解放
が毎回のGC処理でかかる。
 
世代別GCにしたら
木下さんの論文にて検証が行われていた。
オブジェクト指向スクリプト言語Ruby への世代別ガベージコレクションの実装と評価
 
発生する処理
毎回Markの処理が走る(前回GCに生き残ったもの以外)
 ルート(レジスタ、スタック等)の走査、マーク
Sweepの処理が走る(前回GCに生き残ったもの以外)
 Heap領域全走査、不要オブジェクトの解放
が毎回のGC処理でかかる。
 
また
Old世代のMark and Sweep (MajorGC)
ライトバリアの実装(Ruby自体の遅延)
メモリ使用領域の増加
がある。
 
 
そこで改善するとしたら

  • MajorGCのインクリメンタル化

Old世代のMark and Sweep (MajorGC)をインクリメンタル化する(処理分散)
事で停止時間を分散できるのではなかろうか。
 

  • Heap全走査をどうにか

また、Heapを全走査するのではなく、貸し出したものをリスト化しておいて、
そいつを走査すればいいのじゃないか。(メモリ領域はポインタ分増加)
 

  • copyingGCの導入

世代別GCを導入するのであればHeapを2つに分けた方が楽。
という事はminorGCをMarkAndSweep以外にした方がいい。(保守的GCの為)
であれば2つに分けたOld領域とnew領域を使ってcopyingGCが作る事ができる。
 
 
とりあえず、自分の中でまとめてみて実装してみよう。