ガベージコレクション
勉強机の上にたまった使い終わったノートやお菓子のゴミを、自動で片付けてくれるお掃除ロボットのような仕組みです。
定義 コンピュータープログラムが動作している間、使われなくなったメモリ領域を自ら見つけ出してキレイに片付けてくれる自動清掃システムです。開発者が手作業でメモリを解放しなくても、コンピューターが自動で空きスペースを確保してくれます。
片付けずに物を出したままにし続けると
勉強机で作業しているときのことを思い浮かべてみてください。新しいノートやテキストを次々と机に出すだけで、使い終わった本を本棚に戻さなければ、やがて机がいっぱいになって新しい本を置く場所がなくなってしまいますよね。
コンピューターのプログラムも同じです。何かの処理をするたびに、主記憶装置(RAM)という作業スペースにデータを置いて使います。しかし、用が済んだデータを片付けずに放置したままだと、メモリがいっぱいになってしまう現象(メモリリーク、Memory Leak)が起きてしまいます。
昔はプログラマーがコード上で直接「このデータは使い終わったから消して」と一つひとつ指示する必要がありました。しかし、消し忘れてしまったり、誤って必要なデータを消してしまったりして、プログラムが突然クラッシュするエラーが頻発していたのです。
ゴミかどうかをどうやって見分けるのか?
ガベージコレクタ(掃除役のプログラム)は、定期的にメモリ空間を見回って掃除の対象を探します。このとき、ゴミかどうかを判断する基準はとてもシンプルです。それは「今、手が届く場所にあるか」です。
プログラムの実行コードから、矢印をたどるように繋がっているデータを探していきます。これを専門用語で到達可能性(Reachability)と呼びます。現在動いているコードからどうやっても辿り着けない孤立したデータがあれば、誰も二度と使えない「ゴミ(Garbage)」と判断して消去します。
例えば、ゲームで敵モンスターを倒すと、画面から消えたモンスターのデータはどこからも参照されなくなります。ガベージコレクタはこの接続が切れたモンスターデータを静かに消去し、新しいデータを置くための空きスペースへと戻してくれるのです。
もう少し正確に言うと:タダの掃除はありません
ガベージコレクションのおかげで、プログラマーはメモリ解放という面倒な作業から解放されました。Java、Python、JavaScriptなどの現代の主要なプログラミング言語の多くは、この機能を標準で備えています。
しかし、完璧に見えるこのお掃除ロボットにも代償があります。部屋の隅々までゴミを探している間は、一時的に本来の作業を止めなければならないのです。IT業界ではこれをストップ・ザ・ワールド(Stop-the-world)と呼びます。
ほんの一瞬の停止ですが、0.001秒を争うハイエンドな3Dゲームや株式取引システムなどでは、画面のカクつきや遅延(ラグ)の原因になることがあります。そのため、極限のパフォーマンスと即時性が求められるシステム(C言語やC++など)では、今でも人間が手動でメモリを管理する方法が選ばれることがあります。
🤔 よくある誤解
ガベージコレクションがある言語を使っていれば、メモリ不足になることは絶対にない。
プログラムが誤って使い終わったデータへの参照(つながり)を残したままだと、掃除役もゴミだと判断できず消せません。これを「論理的メモリリーク」と呼びます。
🧺 日常で出会う場面
ガベージコレクションとは、プログラムで使われなくなったメモリ上のデータを自動で見つけ出し、キレイに掃除してくれる便利な仕組みです。