世代別ガベージコレクション
表示
世代別ガベージコレクション (英: generational garbage collection) はガベージコレクションの手法のひとつである。別名として、ジェネレーション・スキャベンジング (英: generation scavenging) とも呼ばれる。以下、ガベージコレクションをGCと省略する。
概要
[編集]GCを持つ言語上で動く実システムでは、経験上メモリオブジェクトの利用に、ある偏りが存在する。それは「計算途上で利用される一時オブジェクトは数が多く、かつすぐさま破棄される率が高い」「ある程度長く生存したオブジェクトは、以降も長く生存する率が高い」という傾向である。
この傾向に着目し、メモリ領域を2つの世代に分離する。
- 第1世代 (young generation) に属するオブジェクトは小さな領域で高速なコピーGCを繰り返し、積極的に回収する。
- 第2世代 (old generation) に属するオブジェクトは基本的に回収せず、システム全体のメモリが不足するようならマーク・アンド・スイープなどで整理する。
というルールを与える。そして第3のルールとして
- 第1世代の回収をある一定回数生き延びたオブジェクトは第2世代に移動する。
を考えるのが世代別GCである。
世代別GCは汎用のGCとしてバランスに優れており、また世代間移動のしきい値や第1世代領域のサイズなど、チューニングがしやすいこと、仮想記憶との相性が良いことなど、利点が多い。特にオブジェクト指向プログラミング言語との相性が良いため、Java (1.2以降[1]) や.NET Framework、Ruby (2.1以降) などに採用されている。.NET FrameworkではGeneration 0, 1, 2の3世代に分かれている[2]。Pythonでは主に参照カウント方式によるライフサイクル管理がなされるが、補助的に(伝統的なマーク&スイープとは逆順の探索アルゴリズムによる)世代別GCを併用している[3][4]。