ガベージコレクション

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

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

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

古代

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

すなわち、不要になったデータ領域は、プログラマーが明示的に開放する必要があった。例えばC++なら、new演算子によって確保されたオブジェクトは、「必ず」delete演算子によって解放する必要がある。

しかしこれは往々にして遂行されず、開放が忘れられたオブジェクトはいつまでもメモリー上に残り続け、必然的にデストラクターも呼び出されない。これをメモリーリークといい、メモリーリークが発生すると解放されないリソースが生じることになる。

メモリーリークは頻繁に発生し、かくして、プログラマーを悩ませ続けた。

オブジェクト指向

オブジェクト指向のプログラミングが主流になると、データ開放のタイミングを正しく認識し、プログラムでそれが正しく行なわれるよう記述する、という行為自体が難しいものとなった。

さらには、マルチスレッドに対応したプログラムとなると、もはや人間の理解を超えたものとなった。

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

利点と欠点

利点と欠点は次の通りである。

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

実現方法

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

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

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

一括処理

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

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

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

リファレンスカウント

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

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

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

機能を持つ言語

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

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

また、.NET Framework環境では、言語仕様としてより、環境仕様としてガベージコレクションに対応している。.NET用言語は全てが対応するが、以下には主要なもののみを例示した。