世代別ガベージコレクション

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動

世代別ガベージコレクション (: generational garbage collection) はガベージコレクションの手法のひとつである。別名として、ジェネレーション・スキャベンジング (: generation scavenging) とも呼ばれる。以下、ガベージコレクションをGCと省略する。

概要[編集]

ガベージコレクションを持つ言語上で動く実システムでは、経験上メモリオブジェクトの利用に、ある偏りが存在する。それは「計算途上で利用される一時オブジェクトは数が多く、かつすぐさま破棄される率が高い」「ある程度長く生存したオブジェクトは、以降も長く生存する率が高い」という傾向である。

この傾向に着目し、メモリ領域を二つの世代に分離する。

  • 第一世代 (young generation) に属するオブジェクトは小さな領域で高速なコピーGCを繰り返し、積極的に回収する。
  • 第二世代 (old generation) に属するオブジェクトは基本的に回収せず、システム全体のメモリが不足するようならマーク・アンド・スイープなどで整理する。

というルールを与える。そして第三のルールとして

  • 第一世代の回収をある一定回数生き延びたメモリは第二世代に移動する。

を考えるのが世代別GCである。

世代別GCは汎用のガベージコレクションとしてバランスに優れており、また世代間移動のしきい値や第一世代領域のサイズなど、チューニングがしやすいこと、仮想記憶との相性が良いことなど、利点が多い。特にオブジェクト指向プログラミング言語との相性が良いため、Java (1.2以降[1]) や.NET FrameworkRuby (2.1以降) などに採用されている。.NET FrameworkではGeneration 0, 1, 2の3世代に分かれている[2]Pythonでは主に参照カウント方式によるライフサイクル管理がなされるが、補助的に(伝統的なマーク&スイープとは逆順の探索アルゴリズムによる)世代別GCを併用している[3][4]

脚注[編集]

関連項目[編集]