ガベージコレクション がべーじこれくしょん
簡単に言うとこんな感じ!
プログラムが使い終わったメモリを自動で掃除してくれる仕組みだよ!ゴミ収集車みたいなもので、「もう誰も使ってないデータ」を見つけて片付けてくれるんだ。おかげでプログラマーが手動で「メモリを返して!」って書かなくて済むってこと!
ガベージコレクションとは
ガベージコレクション(Garbage Collection / GC) とは、プログラムが動作中に使用したメモリ領域のうち、不要になった領域を自動的に検出して解放する仕組みのことです。「ガベージ(garbage)」は英語で「ゴミ」を意味し、使われなくなったデータをゴミとして回収することからこの名がつきました。
プログラムは動作中にデータを保存するため「メモリ」という作業スペースを確保します。昔のプログラミングでは、このメモリを「確保したらプログラマー自身が手動で解放する」必要がありました。しかし解放を忘れると メモリリーク(メモリが少しずつ使われ続けて枯渇する問題)が発生し、システムが不安定になります。ガベージコレクションはこの解放作業を自動化することで、プログラマーの負担を大幅に減らします。
JavaやPython、Go、C#などの現代的な言語の多くはGCを標準搭載しており、業務システムやWebアプリケーション開発の現場では「メモリ管理はGCに任せる」のが一般的なアプローチになっています。
GCの仕組みと主なアルゴリズム
GCはプログラムが確保したメモリ(主に ヒープ領域 と呼ばれる動的確保のための作業場)を監視し、「まだ誰かが使っているか」を判定します。
| アルゴリズム | 概要 | 特徴 |
|---|---|---|
| 参照カウント方式 | オブジェクトが参照されている数を数える | シンプル・即時回収可能。循環参照が苦手 |
| マーク&スイープ方式 | 到達可能なオブジェクトにマークし、残りを回収 | 循環参照も対応。一時停止が発生しやすい |
| コピーGC方式 | 生きているオブジェクトを別領域にコピーし、元領域を丸ごと解放 | 断片化が起きない。メモリを2面使う |
| 世代別GC方式 | 「若い世代」と「老い世代」に分けて管理 | 短命なオブジェクトを効率よく回収できる |
覚え方:「ゴミ出しの手順」で理解する
マーク&スイープ方式は「まずゴミ袋に印をつけて(マーク)、印のないものを捨てる(スイープ)」と覚えると直感的です。「まだ使ってる物に旗を立てて、旗のないものはゴミ!」というイメージです。
世代別GCの構造
ヒープ領域
┌─────────────────────────────────────────┐
│ 若い世代(Young Generation) │ ← 新しく作られたオブジェクト
│ ┌───────────┬──────────┬──────────┐ │ 頻繁にGCされる(Minor GC)
│ │ Eden │Survivor 0│Survivor 1│ │
│ └───────────┴──────────┴──────────┘ │
│ 老い世代(Old Generation) │ ← 長生きしたオブジェクト
│ ┌─────────────────────────────────┐ │ まれにGCされる(Major GC)
│ │ │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘
歴史と背景
- 1959年 — LISPの開発者 ジョン・マッカーシー がガベージコレクションの概念を考案。コンピューター史上最初のGC実装とされる
- 1960〜70年代 — 主に研究・学術用言語(LISP、Smalltalkなど)でのみ使われる。一般の業務システムはC言語など手動メモリ管理が主流
- 1995年 — Java が登場しGCを標準搭載。「メモリ管理を気にせず書ける言語」として企業システムに急速普及
- 2000年代 — Python・Ruby・C#・PHPなど多くの言語がGCを標準採用。Webアプリ開発の主力へ
- 2010年代 — スマートフォンアプリ(Android/Java、iOS/Swift)にもGCが広がる。一方でゲームやリアルタイム処理では「GCの停止時間」が問題となり最適化が課題に
- 2015年〜現在 — Go言語 の低レイテンシGC、Javaの ZGC / Shenandoah GC など、停止時間を極限まで短縮する次世代GCが登場
GCのメリット・デメリットと言語別比較
GCは便利な反面、「GCが動くとプログラムが一瞬止まる(Stop-the-World)」という課題があります。銀行の決済処理やゲームのリアルタイム描画など、止まってはいけないシステムでは特に注意が必要です。
| 観点 | GCあり(Java / Python等) | GCなし(C / C++等) | 所有権モデル(Rust) |
|---|---|---|---|
| メモリ管理 | 自動 | 手動 | コンパイル時に自動検証 |
| 開発の楽さ | ◎ 楽 | △ 慎重さが必要 | ○ ルールに慣れが要る |
| 実行速度 | ○(GC停止あり) | ◎ 高速 | ◎ GC停止なし |
| メモリリークリスク | 低(GCが防ぐ) | 高(ヒューマンエラー) | 極めて低(コンパイラが防ぐ) |
| 主な用途 | 業務システム・Web | OS・組み込み・ゲームエンジン | システムプログラミング |
GCの動作フロー(SVG図解)
関連する規格・RFC
※ ガベージコレクション自体はRFCやISO規格として標準化されているものはありませんが、各言語仕様・処理系のドキュメントがデファクトスタンダードとなっています。
関連用語
- ./035-heap-memory.md — ヒープ領域:GCが管理するメモリの動的確保エリア
- ./036-stack-memory.md — スタック領域:関数呼び出し時に使われる自動管理のメモリ領域
- ./037-memory-leak.md — メモリリーク:解放されずに残り続けるメモリ問題
- ./039-reference-counting.md — 参照カウント:GCアルゴリズムの一種。Pythonなどが採用
- ./040-stop-the-world.md — Stop-the-World:GC実行中にプログラム全体が一時停止する現象
- ./041-rust-ownership.md — 所有権モデル(Rust):GCなしでメモリ安全を実現するRustの仕組み
- ./042-jvm.md — JVM(Java仮想マシン):JavaのGCが動作する実行環境