定義
コンピュータのプログラムが動いている間に、もう使われていないメモリ領域を自分で見つけ出してきれいに空けてくれる、自動お掃除の仕組みです。開発者がいちいちメモリを返さなくても、コンピュータが空き容量を確保してくれます。
片づけずに、物を出しっぱなしにしたら
机で勉強するときを思い浮かべてみましょう。新しい教材やノートを出して使うばかりで、読み終えた本を元の場所に戻さなければ、そのうち机がいっぱいになって、新しい本を置く場所がなくなりますよね。
コンピュータのプログラムも同じです。何か作業をするたびに、メインメモリ(RAM)という作業スペースにデータを載せて使います。ところが、使い終わったデータを片づけずに積み上げていくと、コンピュータのメモリがいっぱいになってしまう現象(メモリリーク、Memory Leak)が起こります。
ガベージコレクションのない言語では、プログラマーがコードの中に「このデータはもう使い終わったから消して」と、ひとつずつ書かなければなりません。そのうちうっかり消す命令を書き忘れたり、別のデータを消してしまったりして、プログラムが突然止まるエラーがよく起こります。
ごみかどうかは、どうやって見分けるの?
ガベージコレクタ(お掃除役のプログラム)は、定期的にメモリ領域を見まわして、片づける対象を探します。広く使われている方式では、ごみかどうかを判断する基準はとてもシンプルです。それは「今、手が届くものかどうか」です。データごとに、自分を指しているつながりの数を数えて、0になったら消す方式もあります。
プログラムの実行コードから、矢印をたどるようにつながっているデータを探していきます。これを専門用語で到達可能性(Reachability)と呼びます。いま動いているコードから、どんな道すじでもつながっていない孤立したデータがあれば、もう誰も使えない「ごみ(Garbage)」と判断して消してしまいます。
たとえばゲームでモンスターを倒すと、画面から消えたモンスターのデータは、もうどこにもつながっていません。お掃除ロボットは、このつながりが切れたモンスターのデータをそっと消して、ほかの新しいデータを入れられる空き領域に戻してくれるのです。
もう少し正確に言うと: ただのお掃除はありません
ガベージコレクションのおかげで、プログラマーはメモリを空けるという頭の痛い作業から解放されました。Java、Python、JavaScriptなど、多くのプログラミング言語がこの機能を標準で備えています。
とはいえ、完璧に見えるこのお掃除ロボットにも代償があります。部屋じゅうをくまなく調べてごみを探している間は、いったん作業を止めなければならない場合が多いのです。コンピュータの分野では、これを世界が止まる(Stop-the-world)と表現します。最近は、お掃除のほとんどをプログラムと同時に進めて、この停止をごく短くした方式も広く使われています。
ほんの一瞬の停止ですが、0.001秒が大事な高性能の3Dゲームや株式取引システムでは、画面がもたついたり、遅れが出たりすることがあります。そのため、最高レベルの性能と即座の反応が必要なシステム(CやC++などの言語)では、今でも人が直接メモリを管理する方式を使うことがあります。
よくある誤解
ガベージコレクションのある言語を使えば、メモリが足りなくなることはまったくない。
プログラムがうっかり、使い終わったデータとのつながりを切らずに持ち続けていると、お掃除ロボットもそれがごみだと分からず、消せません。これを「論理的メモリリーク」と呼びます。
日常で出会う場面
ウェブページでリストの項目やポップアップを削除したとき、もう使われないそのデータを、JavaScriptエンジンのガベージコレクタが片づけます。
スマートフォンのアプリで別の画面に移ったとき、前の画面の画像データを自動で空けてくれます。
つまり ひとことで
ガベージコレクションは、プログラムがもう使っていないメモリ上のデータを自動で見つけて片づけてくれる、便利な自動管理の仕組みです。