【がべーじこれくしょん】

ガベージコレクション とは?

💡 メモリの「自動お掃除」
📌 このページのポイント
ガベージコレクション(GC) GC実行前 メモリ領域 オブジェクトA 参照あり オブジェクトB 参照なし オブジェクトC 参照あり オブジェクトD 参照なし オブジェクトE 参照あり オブジェクトF 参照なし ルート GC実行 GC実行後 メモリ領域 オブジェクトA 生存 オブジェクトC 生存 オブジェクトE 生存 空き領域 = 参照あり(使用中) = 参照なし(ゴミ)→ GCが回収 = 解放済み GCは「誰からも参照されていないオブジェクト」を自動的に検出して解放する Java・C#・Go・JavaScript などの言語が自動で実行する
不要になったメモリを自動的に検出・回収する仕組み
ひよこ ひよこ

なぜGCが必要なの?

ペンギン先生 ペンギン先生

プログラムがメモリを確保した後、不要になったタイミングで手動で解放するのは難しい。解放忘れはメモリリーク(メモリが延々と増え続ける)、早すぎる解放は解放済みメモリへのアクセス(クラッシュやセキュリティ脆弱性)になる。GCはこの面倒をプログラマに代わって自動でやってくれるんだよ

ひよこ ひよこ

GCの仕組みは?

ペンギン先生 ペンギン先生

代表的な方式は2つ。①マーク&スイープ:ルート(グローバル変数、スタック変数)から参照をたどって到達可能なオブジェクトに印を付け、印のないオブジェクトを解放。②世代別GC:新しいオブジェクトは短命なことが多いので、「若い世代」を頻繁に、「古い世代」をまれにGCする。JavaのG1GCは世代別だよ

ひよこ ひよこ

Stop-the-Worldって何?

ペンギン先生 ペンギン先生

GCがメモリを回収する間、アプリケーションスレッドを一時停止すること。この間リクエストが処理されないからレイテンシが悪化する。JavaのZGCやGo 1.8以降はSTW時間を1ms以下に抑えている。リアルタイム性が求められるシステムではGCチューニングが重要だよ

ひよこ ひよこ

RustにGCがないのはなぜ?

ペンギン先生 ペンギン先生

Rustは所有権システム(Ownership)でコンパイル時にメモリの寿命を決定する。変数がスコープを抜けたら自動解放。GCのランタイムオーバーヘッドがゼロで、かつ手動管理のバグもない。C++のスマートポインタを言語レベルで強制した仕組みとも言える。安全性とパフォーマンスを両立した革新的アプローチだよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ガベージコレクション」って出てきたら「不要なメモリを自動で回収する仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Garbage Collection (GC)」 = ごみ収集
💬 Garbage(ごみ)をCollection(収集)する。1959年にJohn McCarthyがLISP用に発明したよ
← 用語集にもどる