PR

  ガーベジ・コレクションは,プログラムの実行中に用済みになったメモリー領域をリサイクルする処理です。ガーベジとは「ゴミ」のことで,ガーベジ・コレクションの直訳は「ゴミ集め」です。

 コンピュータがプログラムを実行するときには,プログラム本体をロードするメモリー領域とは別に,様々な情報を保持するためのメモリー領域が必要です。これらは大きく,(1)変数を格納する領域,(2)オブジェクトを格納する領域の2種類に分類できます。これらのうち,ガーベジ・コレクションで集める「ゴミ」は,(2)のオブジェクトを格納する領域で発生するものです。

 オブジェクトを格納する領域の管理には,あらかじめ十分に大きなメモリー領域を用意しておいて,必要に応じてそこから連続領域を切り出して使う「ヒープ」と呼ぶ手法が用いられます。コンピュータのメモリー容量には限りがあるので,必要なときに必要十分な大きさの領域を確保して利用し,不要になったらなるべく早くその領域を解放する(再利用可能な状態に戻す)必要があります。さもないと,いずれプログラムが利用できるメモリー領域が不足して,プログラム実行に支障が出てしまいます。

 このメモリー領域の解放処理を自動で行う仕組みがガーベジ・コレクションです。「ガーベジ・コレクタ」と呼ぶプログラムが,不要になった領域を見つけ出して,自動的に再利用可能な状態に戻します。Java仮想マシンや .NET Frameworkの共通言語ランタイム(CLR)は,いずれもガーベジ・コレクタを備えています。

 一方,ガーベジ・コレクタがない実行環境もあります。ほとんどのC/C++環境はガーベジ・コレクタを持っていません。そのような環境では,不要になった領域をプログラム内で明示的に解放しなければなりません。解放し忘れた領域は,再利用されないままムダに存在し続ける「メモリー・リーク」となり,時に発見しづらい不具合の原因となります。

 なお,変数を格納する領域は,必ず確保した順序とは逆の「先入れ後出し」の順序で解放できます。例えば,メソッドAから呼び出されるメソッドBがあるとき,B内の変数の領域は,必ずA内の変数の領域より先に不要になります。このため,ヒープ領域のようにガーベジ・コレクタを使った複雑な管理は必要なく,スタックを使うことでムダなく管理できます。