ガベージコレクション

読み:ガベージコレクション
外語:GC: Garbage Collection
品詞:名詞

不要になったデータを解放してデータ領域を利用可能な状態に戻すこと、もしくはその行為。

原義は "ゴミ集め" の意。

動的なメモリ取得機能を持ったプログラミング言語のうち、CC++といった言語では動的に確保したメモリの管理はすべてプログラマが行なわねばならない。

すなわち、不要になったデータは、プログラマが明示的にそれを開放する必要があった。しかし、これはメモリリークの発生が懸念される危険なものであった。

また、オブジェクト指向プログラミングが主流になると、データ開放のタイミングを正しく認識し、プログラムでそれを行なわせるという記述をすること自体が難しいものとなった。さらには、マルチスレッドに対応したプログラムとなると、もはや人間の理解を超えたものとなった。

そこで、近年のプログラミング言語は言語仕様でガベージコレクション機能を持たせる事が多くなったのである。

利点と欠点

  • プログラミングが楽になり、メモリリークが発生しない
  • ガベージコレクションの処理がいつ行なわれるかがわからない
    • そのため、いきなりパフォーマンスが低下したり、機能不全に陥ることがある
    • これを防ぐため、負荷が少ない時は随時ガベージコレクションを行なうものも存在する

実現方法

動的メモリの確保時に、データ本体と別に参照情報も持たせることでデータの要不要を判定できるようにする。状況に応じて不要になったデータ領域を解放し、再び利用可能な状態にする。

不要メモリを解放しただけでは領域が断片的に分散する形になってしまう(断片化)ため、データ領域を再配置して領域をまとめる機能を持っているのが普通である。

ガベージコレクションの方式

一括処理

プロセスに割り当てられているメモリの利用量がある一定の大きさに到達したとき、それまで確保されたメモリに関して参照元を検索し、参照元が存在しない場合は一括してそれらを開放するもの。

ガベージコレクションの処理のため、実装にもよるが、プログラムが長時間停止する事もある(特に、シングルスレッド、シングルタスクで動作するような環境)。またこの場合、どのみち時間がかかるのならと、同時にデータの再配置を行なってしまうものも多かった。

Javaなどは一括処理方式を採用しているが、ガベージコレクションは大抵の実装で別スレッドで実行されるため、止まるということは基本的にはない。

リファレンスカウント

データのスコープ範囲外に処理が移るなどしてデータを参照する命令が無くなった時点でそのデータが不要になったと判定して解放を行なうもの。随時処理を行なうため、ガベージコレクションのために処理を一時停止させる必要がない。

ただし、循環構造(リンク構造を参照し続けていくと元のデータに戻るようなデータの繋がり)のデータに対しては何らかの対策を講じる必要がある。また、逐次的に解放を行なうために断片化した領域の再配置のような機能は原理的に難しい。

PerlPythonはこの方式を採用している。

機能を持つ言語

インタプリタ型言語に多い。

コンパイル型言語に少ないのは、動的メモリの確保に関してOSの支援を直接受けるため、ガベージコレクションを実現させるのはあまり合理的でないためと考えられる。

.NET Framework環境では、言語仕様としてより、環境仕様としてガベージコレクションに対応している。次のような言語の.NET環境で対応する。