BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース SGen - Mono の世代別ガベージコレクタ

SGen - Mono の世代別ガベージコレクタ

原文(投稿日:2011/01/20)へのリンク

Mono は API に関しては,概ね .NET に遅れを取ることなく,立派な仕事を継続している。しかしながら,大差を開けられた重要領域がひとつある。デフォルトのガベージココレクタが,可搬性はあるが処理正確性に劣る Boehm-Demers-Weiser 保守的ガベージココレクタ (Boehm GC) である点だ。このガベージコレクタには,レジスタとスタックフレームを正確に読み込めない,という主要な問題がある。一般的に任意の値に対して,それがポインタ値であるかスカラ値であるかを判断することはできない。そのため GC は,それが常にポインタであると仮定して,関連するオブジェクトの生存性を判断する。このことが単に大きなメモリチャンクの正確な回収処理を妨げるだけでなく,フリースペースの圧縮をも困難にするのだ。

SGen こと "Simple Generational" は,Mono が持つ新たなガベージコレクタである。2年前に開始されたこのプロジェクトの目的はその名のとおり,Mono のオリジナルのガベージコレクタを,.NET 版 CLR で見られるのと同等の正確性を持った世代別ガベージコレクタに置き換えることだ。3世代を区別する .NET に対して,SGen ガベージコレクタは2つの世代を用いるという違いはあるものの,大規模オブジェクト用に別ヒープを使用する,などの点は共通している。

現時点ではまだプレビュー版である Mono 2.10 以前,SGen はまだ非常に保守的なものだった。新バージョンでは,マネージドスタックフレームの正確な管理がサポートされることにより,誤検出の発生率は非常に低くなる。ただし p/Invoke コールによって生じるアンマネージドスタックフレームについては,引き続き保守的手法によるスキャンを行なう。

SGen の最大の弱点は .NET と同じ,固定オブジェクト (pinned object) にある。SGen の新世代領域 (nursery,.NET の0世代に相当) 内のオブジェクトが固定されると,新世代領域からの移動が不可能となり,メモリの断片化が発生する。さらにいくつかの理由により,この問題は SGen ではさらに悪化する。メモリの断片化に直面するだけでなく,SGen がメモリを割り当てる世代が断片化するのだ。すべてのアクティブなオブジェクトを新世代領域外にコピーした後,全領域が再利用可能になるのが理想である。

問題を複雑化しているのは,SGen は 明示的な固定オブジェクトに対して .NET がさほど注意を払っていない点だ。先に述べたように,アンマネージドスタックフレームの保守的手法による検索では,新世代領域のメモリアドレスと一致する値がスタック内にあるというだけの理由で,オブジェクトが固定されてしまう可能性がある。おそらくこれは,今後のバージョンにおいて p/invoke コールに関連する固定ロジックを高信頼化する,という形で修正されるだろう。

この記事に星をつける

おすすめ度
スタイル

BT