メモリリークとガベージコレクション(memory leak / garbage collection)
使い終わった記憶領域を返し忘れると空きが減っていくことをメモリリークという。これを自動で回収する仕組みがガベージコレクション。
もう少し詳しい説明
プログラムは、動いている途中で主記憶(いま使うプログラムとデータを置いておく記憶装置)の場所を借りて使います。借りたら、使い終わったときに返す必要があります。
ここでいう「借りる」「返す」は、この領域はいま自分が使うと申し出る/使い終わったので他の人が使ってよいと申し出る、という手続きのことです。
この「返す」を忘れると、使っていないのに空かない領域が残ります。これがメモリリークです。
返し忘れた領域は、誰も使えない
厄介なのは、その場では何も起きないことです。少しずつ空きが減るだけなので、動かし始めは正常に見えます。
症状が出るのは、長く動かし続けたときです。
- 起動直後は速いのに、何日か動かすと遅くなる
- そのうち領域の確保に失敗し、異常終了する
- 再起動すると直り、またしばらくして同じことが起きる
再起動で直るのに、原因が分からない。 メモリリークが見つけにくいのは、この性質のためです。
仮想記憶を使っていると、空きが減った分だけページの入れ替えが増えます。止まる前に、まずじわじわ遅くなるという形で現れます。
ガベージコレクション
返し忘れを人の注意で防ぐのは難しい、というところから生まれたのがガベージコレクションです。
やっていることは単純で、もう誰からも参照されていない領域を探し出し、空きとして回収することです。「ごみ集め」という名前のとおりです。
プログラムを書く人は、返す処理を書かなくてよくなります。使い終わったかどうかは、実行環境が参照を見て判断します。
探し方には、いくつかの方式があります。
- 参照カウント方式 … その領域を参照している数を数えておき、0になった時点で回収する。すぐ回収できるが、互いに参照し合っている輪が残る
- マークアンドスイープ方式 … 使っているものに印を付けてから、印の無いものをまとめて回収する。輪になっていても回収できるが、回収のあいだ処理が止まる
自動でも、漏れることはある
ここが試験でも実務でも落とし穴です。ガベージコレクションがあってもメモリリークは起こります。
回収されるのは「もう誰からも参照されていない領域」です。使う気がないのに参照だけ残っていると、実行環境からは使用中にしか見えません。
- 一覧に追加したまま、消し忘れている
- 終わった処理の通知先として、登録したままになっている
使い終わったつもりなのは人間だけ、という状態です。自動回収は「返し忘れ」を防ぎますが、「参照の外し忘れ」までは防げません。
断片化と、詰め直し
空きが増えても、ばらばらの位置に散らばっていると大きな領域が取れません。これを断片化(フラグメンテーション)と呼びます。
散らばった使用中の領域を前へ詰め直し、空きを1か所にまとめることをコンパクションと呼びます。ガベージコレクションとは別の作業で、回収のあとに続けて行う方式もあります。
何に使われているのか
Java、C#、Python、JavaScript など、いま広く使われている言語の多くが、実行環境にガベージコレクションを備えています。共通言語基盤でも、回収は実行環境の仕事です。
一方、CやC++では、借りたら返す処理を自分で書きます。止まってはいけない機器など、回収のために処理が止まると困る場面では、いまもこちらが選ばれます。
試験ではこう出る
科目A(旧・午前)で出ます。いちばん多いのは、ガベージコレクションの説明を選ばせる問題です。「使われなくなった領域を自動で回収する」が答えになります。
並べて出される紛らわしい言葉は、次のとおりです。
| 言葉 | 何をすることか |
|---|---|
| ガベージコレクション | 使われなくなった領域を回収する |
| コンパクション | 使用中の領域を詰め直し、空きを1か所にまとめる |
| メモリリーク | 解放し忘れで、空き領域が減り続ける |
| 断片化 | 空きが散らばり、まとまった領域が取れなくなる |
次に多いのが、メモリリークが起きたときの症状です。「長時間の運用でしだいに性能が低下する」という表現が答えになります。
応用情報では、参照カウント方式とマークアンドスイープ方式の違いまで問われます。互いに参照し合っている輪を回収できるかが、両者の分かれ目です。
関連する用語
- 主記憶
- CPUが直接読み書きする記憶。確保と解放は、ここの領域を取り合う話
- 仮想記憶
- 主記憶より大きく見せる仕組み。空きが減ると、ページの入れ替えが増えて遅くなる
- オブジェクト指向
- データと処理をまとめて作る考え方。インスタンスを次々に作るので、回収の仕組みが要る
- 共通言語基盤
- 複数の言語を同じ実行環境で動かす仕組み。ガベージコレクションもその環境が受け持つ
ミニクイズ
ガベージコレクションの説明として、最も適切なものはどれか。
正解は 3番:使われなくなった記憶領域を見つけ出し、自動的に再利用できる状態に戻すこと
ガベージコレクションは、プログラムがもう参照していない記憶領域を実行環境が自動で探し出し、空き領域として回収する仕組みです。解放を書き忘れても空きが減り続けないので、メモリリークの多くを防げます。使用中の領域を前へ詰め直して断片化を解消するのはコンパクション、主記憶と補助記憶を入れ替えながら実行するのは仮想記憶の仕組みです。確保した領域を解放し忘れて空きが減り続けるのはメモリリークそのもので、ガベージコレクションが防ごうとしている側の現象です。
この分野をまとめて解く → システム構成要素とソフトウェアのミニテスト(全28問)
最終更新:2026-10-09