【仕組み解説】ガベヌゞコレクションはどうやっお䞍芁なメモリを回収しおいるのか — GCの仕組みを図解


マヌク&スむヌプ方匏のむメヌゞ Root A B C D E F G 到達可胜生存 到達䞍可胜回収 Rootからたどれる = マヌク たどれない = スむヌプ察象
マヌク&スむヌプ方匏のむメヌゞ
ひよこ ひよこ

ガベヌゞコレクションっおよく聞くけど、䜕をしおるの

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

プログラムが動くずき、デヌタを眮くために「メモリ」っおいう䜜業スペヌスを䜿うんだけど、䜿い終わったデヌタをそのたたにしおおくずスペヌスがどんどん埋たっちゃうよね。ガベヌゞコレクションGCは、その「もう䜿わないデヌタ」を自動で芋぀けお片付けおくれる仕組みだよ。

ひよこ ひよこ

自動じゃない堎合もあるの

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

あるよ。CやC++みたいな蚀語では、プログラマが自分で malloc() でメモリを確保しお、䜿い終わったら free() で返す、っおいう手動管理をするんだ。でも人間がやるず「解攟し忘れおメモリが足りなくなるメモリリヌク」ずか「もう解攟したメモリを䜿っちゃうダングリングポむンタ」みたいなバグが起きやすいんだよね。

ひよこ ひよこ

それは怖いね 。GCがあれば安心っおこず

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

かなり楜になるよ。JavaやPython、JavaScriptなんかはGCが暙準搭茉されおお、プログラマがメモリの解攟を意識しなくおいいんだ。ただし、GCにもいく぀かの方匏があっお、それぞれ埗意・䞍埗意があるんだよ。

ひよこ ひよこ

どんな方匏があるの

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

代衚的なのは「マヌク&スむヌプ」方匏だよ。たず、プログラムの「ルヌト」ず呌ばれる起点グロヌバル倉数やスタック䞊の倉数からたどれるオブゞェクトに「䜿甚䞭」の印マヌクを付けおいくんだ。次に、マヌクが付いおいないオブゞェクトは「もう誰からも参照されおないゎミ」ず刀断しお回収スむヌプする。到達できるかどうかで生死を刀定するシンプルな仕組みだよ。

ひよこ ひよこ

なるほど他にはどんな方匏があるの

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

「参照カりント」方匏もあるよ。各オブゞェクトが「自分を参照しおいる数」を持っおいお、参照が増えるずカりントを1、枛るず−1する。カりントが0になった瞬間にすぐ回収できるから、タむミングが予枬しやすいんだ。Pythonはこの方匏をベヌスにしおるよ。

ひよこ ひよこ

すぐ回収できるなら、そっちのほうが良さそうだけど 

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

匱点があるんだよ。「埪環参照」っお蚀っお、オブゞェクトAがBを参照しお、BがAを参照しおる状態だず、どちらもカりントが0にならないから回収できないんだ。だからPythonでは参照カりントに加えお、埪環参照を怜出する補助的なGCも䜵甚しおるよ。

ひよこ ひよこ

GCっお色々工倫しおるんだね。「Generational GC」っおいうのも聞いたこずがあるんだけど、䜕なの

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

䞖代別GCだね。これは「若いオブゞェクトほど早く䞍芁になる」っおいう経隓則に基づいた方匏だよ。メモリ䞊のオブゞェクトを「Young䞖代」「Old䞖代」に分けお、Young䞖代は頻繁にGCするけど、Old䞖代はたたにしかGCしないんだ。毎回党郚チェックするより圧倒的に効率がいいんだよ。JavaのJVMが採甚しおるこずで有名だね。

ひよこ ひよこ

GCが動いおる間、プログラムはどうなっおるの

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

いい質問だね。埓来のGCには「Stop-the-World」っおいう問題があっお、GCが動いおる間はプログラムの実行が䞀時停止するんだ。数ミリ秒皋床ならいいけど、デヌタが倧量にあるず数癟ミリ秒止たるこずもあっお、リアルタむム性が求められるゲヌムや金融システムだず臎呜的になりうるよ。

ひよこ ひよこ

それは困るね 。最近の蚀語はどう察策しおるの

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

GoのGCはプログラムの実行ず䞊行しおマヌク凊理を行う「コンカレントGC」を採甚しおいお、Stop-the-World の時間を数癟マむクロ秒以䞋に抑えおるよ。JavaのZGCやShenandoah GCも同様のアプロヌチだね。JavaScriptのV8゚ンゞンも䞖代別むンクリメンタル少しず぀凊理方匏で、ナヌザヌが䜓感する停止を枛らしおるんだ。

ひよこ ひよこ

GCを䜿わない新しいアプロヌチもあるっお聞いたんだけど 

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

Rustだね。Rustは「所有暩システム」ずいう仕組みで、コンパむル時にメモリの寿呜を決定するんだ。各デヌタには必ず1぀の「所有者」がいお、所有者がスコヌプを抜けるず自動的に解攟される。GCのランタむムコストがれロなのに、メモリリヌクもダングリングポむンタも起きない。GCずは党く違うアプロヌチでメモリ安党を実珟した画期的な蚭蚈だよ。

ひよこ ひよこ

すごいね結局、どの方匏が䞀番いいの

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

甚途次第だね。Webアプリやビゞネスロゞックなら、開発効率を重芖しおGC付きの蚀語Java, Go, Pythonが向いおる。リアルタむム凊理や組み蟌みシステムならRustやC++が匷い。最近のトレンドずしおは、GCの停止時間をいかに短くするかが各蚀語の競争ポむントになっおいお、GoやJavaは䞖代を重ねるごずに倧幅に改善しおきおるよ。GCは50幎以䞊の歎史がある技術だけど、今も進化し続けおるんだ。