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

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

最終更新:
💡 メモリの「自動お掃除」

プログラムが使わなくなったメモリを自動で回収する仕組み。到達可能性を調べる方式では、実行中のプログラムから参照をたどれないオブジェクトを回収対象にする。

📌 このページのポイント
ルートから到達できるかを調べる参照をたどるGCの例ルートACBD参照の向き緑 A・C:到達できるので残す橙 B・D:互いに参照していてもルートから到達できず、回収対象
矢印はオブジェクトへの参照。ルートからAを経てCに到達できます。BとDは互いに参照していてもルートから到達できません。回収しても領域がすぐOSに返るとは限りません。
ひよこ ひよこ
なぜGCが必要なの?
ペンギン先生 ペンギン先生
確保したメモリをいつ解放するか、全て手動で判断するのは難しいからだよ。解放忘れや、解放済みの領域を使う問題を減らせる。ただしGCがあっても、不要なデータを参照し続けると回収できず、メモリ使用量が増えることはあるんだ
ひよこ ひよこ
GCの仕組みは?
ペンギン先生 ペンギン先生
例えばマーク&スイープは、変数などのルートから参照をたどり、到達できるものに印を付け、印のないものを回収するよ。互いに参照するだけでルートから到達できない集まりも対象になる。参照数だけで判断する方式とは違うんだ
ひよこ ひよこ
世代別GCは別の方式?
ペンギン先生 ペンギン先生
オブジェクトの年齢などで領域を分け、新しいものを中心に調べる工夫だよ。マーク&スイープなどと組み合わせられるので、二者択一ではない。GCには世代別、少しずつ処理する方法、アプリと並行する方法など、複数の工夫があるんだ
ひよこ ひよこ
Stop-the-Worldって何?
ペンギン先生 ペンギン先生
GCの処理のためにアプリの実行を一時停止することだよ。応答時間に影響するので、停止を短くする工夫がある。例えばGoのGCは多くの処理をアプリと並行して行うけれど、短い停止もある。常に1ms以下とか、GCの間ずっと止まるとは言えないんだ
ひよこ ひよこ
RustにはGCがないのに、手動で全部解放するの?
ペンギン先生 ペンギン先生
そうではないよ。Rustは所有権の規則をコンパイル時に確認し、所有者がスコープを抜けると実行時にdropで資源を解放する。C++にもRAIIやスマートポインタがある。GCがないことと、解放を全て手で書くことは別なんだ
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ガベージコレクション」って出てきたら「不要なメモリを自動で回収する仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Garbage Collection (GC)」 = ごみ収集
💬 Garbageはごみ、Collectionは収集。使わなくなったメモリを回収することを、ごみ収集にたとえた名前だよ

参考資料

← 用語集にもどる