ガベージコレクション
Garbage Collection
実行環境が管理するメモリのうち、プログラムから到達できなくなったオブジェクト等を回収し、再利用できるようにする仕組みです。参照が残っている不要データまで意図を理解して消すわけではありません。
🐾 猫で例えると?
こちらをじっと見つめるアメショは、まるでお片付けの点検係。この係が調べるのは、データへ進む手掛かりである「参照」をつないで、プログラムからそのデータへたどれるかです。プログラムから参照をたどっても届かないデータの置き場所を回収するのがGC(ガベージコレクション)。単に使っていないだけでなく、参照でたどれるかが判断のポイントです。
💻 IT現場における「ガベージコレクション」とは?
メモリ管理の方式は言語や実行環境により異なります。Cでは確保と解放を扱い、C++ではRAIIやスマートポインターも利用します。GCを持つJavaScript等でも、不要な参照を保持すればメモリを使い続けるため、リークがなくなるわけではありません。
Java、Python、JavaScriptなどの実行環境にはGCがあり、管理対象のメモリについて、開発者が一つずつ解放する負担を減らします。ただし、方式や回収のタイミングは実行環境によって異なります。不要なデータを参照し続けない設計は、GCがあっても必要です。
⚠️ ガベージコレクションの仕組みと注意点
GCは実行時間やメモリを消費しますが、必ずメモリを使い切るまで待つわけではありません。一部の処理で実行を止める方式に加え、段階的・並行に回収を進める方式もあり、停止時間は実装と負荷で変わります。
// JavaScriptで参照を外す例
let cat = { name: "茶トラ" };
let selected = cat;
cat = null; // selectedから参照できるので、まだ回収対象にならない
selected = null; // 他に参照がなければ回収可能になる
// この瞬間に必ず回収されるわけではない 処理が重いときは、GC回数だけでなくメモリ使用量の推移、オブジェクトの確保量、停止時間を測ります。参照を切ることは回収の機会を作りますが、すぐにOSへメモリが返るとは限りません。
🛠️ ガベージコレクションと賢く付き合うためのポイント
GCに任せきりにすれば良いというわけではありません。賢く付き合うためのコツを紹介します。
- 不要なオブジェクトを作らない: メモリを片付けるコストを下げる一番の近道は、ゴミ(不要なデータ)を出さないことです。再利用可能なオブジェクトは使い回し、むやみに新しいデータを作らない心がけが必要です。
- 参照が残る場所を調べる: JavaScriptの到達可能性に基づくGCは、外から到達できない循環参照も回収できます。グローバル変数、長寿命のキャッシュ、イベントリスナー等から不要データが保持されていないかを確認します。
- 処理の山を把握する: 応答が遅れる時間帯と、GCによる停止時間やメモリ使用量を照合します。重なりがあれば、オブジェクトの確保量や保持期間を見直す判断材料になります。
こちらをじっと見つめるアメショのように、メモリが増え続ける原因も観察して探します。GCがあっても、イベントリスナーやキャッシュから参照されているデータは残り得ます。不要な参照と回収時の負荷を調べ、使い終わったデータが手放される設計かを確認しましょう。