こんちには。キノコードです。
このレッスンでは、 ガベージコレクションについて説明をします。
▼ YouTube動画はこちらからどうぞ。
ガベージコレクションとは、プログラミングにおけるメモリ管理を自動で行ってくれるシステムのことです。省略して、GC(ジーシー)とも呼ばれます。
メモリ管理とは、プログラミングで変数のデータを保存するためにメモリ領域を割り当てたり、使い終わった変数のメモリ領域を解放したりすることです。
ガベージコレクションは、1959年頃に、人工知能の第一人者であり、人工知能という言葉を世に出した「ジョン・マッカーシー」によって発明されました。
ガベージコレクションは、ほとんどのプログラミング言語でデファクトスタンダートとなっています。
有名な言語で言えば、Java、C#、PHP、Python、Ruby、JavaScript、Kotlin、Swift、Visual Basicなどはガベージコレクションを採用しています。
ガベージコレクションの仕組み
ガベージコレクションの仕組みについてJavaを例に説明します。
ガベージコレクションには2種類あります。
1つ目はScavenge GC(スキャベンジ・ジーシー)というガベージコレクションで、2つ目はFull GC(フル・ジーシー)というガベージコレクションです。
これら2つは実行する領域に違いがあります。
メモリには、プログラムが使用できるメモリ領域があります。これを「ヒープ領域」といいます。
ヒープ領域には、新しいデータが入る「New領域」と古いデータが入る「Old領域」があります。
New領域にはScavenge GC(スキャベンジ・ジーシー)が実行され、Old領域にはFull GC(フル・ジーシー)が実行されます。
これらの違いは、掃除に例えるなら、Scavenge GCは「日頃のお掃除」、Full GCは「年末の大掃除」です。
「日頃のお掃除」は頻度が高く、よく使う部分のみ掃除します。そのため、かかる時間も少ないです。
一方、「年末の大掃除」は頻度が少なく、広い範囲を長い時間かけておこないます。
Full GCは処理が重いので頻繁に発生すると、システムのパフォーマンスに影響を与えることがあります。
メモリ手動管理
ガベージコレクションが採用されていないプログラミング言語では、ソースコードで明示的にメモリを管理する必要があります。
例えば、C言語だと、メモリ領域を確保するために malloc() 関数を使います。
使わなくなったメモリ領域を解放するためには free() 関数を使います。
万が一解放し忘れると、メモリの使用領域が増加し、次のメモリ領域が確保できなくなります。
そうなるとエラーを起こしたり、プログラムが強制終了を起こしたりしてしまいます。
ガベージコレクションがあると、そういった問題がほとんど起こらないようになります。
ガベージコレクション不採用言語
ガベージコレクションは、自動でメモリを管理できる便利さから、非常に多くのプログラミング言語で取り入れられています。
しかし、C、C++、Rustなどの言語はガベージコレクションを採用していません。
CやC++が登場した時期はメモリ容量が少なく、厳格なメモリ管理が必要とされていました。
その時代背景からガベージコレクションは採用されていませんが、現在ではライブラリを導入することで使うことができるようになりました。
Rustのメモリ管理は、所有権・借用・ライフタイムという別の概念を採用しています。
これはメモリの安全性とスピードを両立させるための新しい試みです。