[電車の中でコツコツScheme処理系を書く日記] 途中下車
現在は、ひたすらメモリ領域をmallocして捨てているので、盛大にメモリリークします。
そろそろGCを実装したいんだけど、どうしようかなー。分別のある大人の態度としてはboehm GC
とかを使うべきなんだろうけどなー。せっかく無駄に言語処理系を作っているんだから、自分で実装したいですね。
というわけで、前からあこがれていたストップ・アンド・コピー方式のGCを実装してみようかと思います。
ストップ・アンド・コピーの利点としては、
- 新規領域の割り当てが高速
- メモリコンパクションの効果もあるので、フラグメンテーションを解消し、CPUのキャッシュに乗りやすい
- 循環参照オブジェクトも回収できる
- なんかかっこいい(当社比)
- 他のアプリケーションとリンクしたり組み込んだり連携したりするときのトラブルが少ない(mallocに細工とかする必要が無い)
欠点は、
- メモリ領域の効率が半分(改善する手段あり)。
- 停止時間が長くなる
- 任意のオブジェクトは改修できない(GCが、オブジェクトの内部構造をあらかじめ知っている必要がある)