ガベージコレクション(GarbageCollection)とは、動的に確保されたメモリ領域のうち、使われなくなった領域を自動的に解放する機能。ガベージコレクションを行うモジュール(実装)の事をガベージコレクタ(GarbageCollecter,GC)と言う。
ガベージコレクションは言語や標準ライブラリ、OSといった環境に組み込まれて提供される。
ガベージコレクションの必要性
プログラムが動くとき、プログラムが使うデータを格納するためにメモリを確保する。格納する量が決まっていないときや、実行中に格納する量を変える必要があるとき、メモリを動的に確保する。ここで言う動的とは、設計時(プログラムを書いているとき)には確保する量が決められなず、実行時に量が決まるすることを指す。
通常、動的に確保されたメモリ領域は、動的に解放を行う必要がある。これを、行わないと使わないのに確保されたままの領域(=メモリリーク)が発生し、利用できるメモリが減っていく。メモリが少なくなると、システムが重くなったり、不安定になる。アプリケーションの起動ができなくなることもある。
初期の言語はメモリを効率的に使うため、すべてのメモリの確保と解放をプログラマが人力で管理していた。しかし、これはそれなりの技術力を要求するため、プログラマのハードルを上げてしまっていた。
現在でもC/C++といった言語には、標準状態(ライブラリを読み込まない素の状態)ではこの機能は存在しない。特にC言語の場合、標準添付ライブラリでは仕様上では存在しない。
なお、このことで必然的に発生しうるメモリフラグメンテーションを解消すべく、メモリの連続未使用領域の確保を行うことをガベージコレクションと呼ぶことがある。厳密にはこれはメモリコンパクションと呼び、正確とは言いがたい。ガベージコレクションの実装としてメモリコンパクションの機能が内包されているケースが多く、同一の意味合いで用いられることがあるので注意と理解が必要である。
利点と欠点
メモリの確保を人力で管理するのは大変で面倒。なので、コンピュータにさせよう!という話になる。プログラマは面倒ごとをコンピュータに任せたがる人種なのだ。
利点
この動的に解放を行うという事を、プログラマが意識しなくてよいように、言語や標準ライブラリに組み込まれたがガベージコレクションと呼ばれる機能である。これによってプログラマは、メモリの解放を意識せずにたくさんのメモリをより自由に使えるようになった。また、プログラムの敷居を下げた。
また、ガベージコレクションを環境とセットにして実装し、他のプログラマに提供することで、より洗練された高速なガベージコレクション機能の恩恵を、多くのプログラマが受けることにもなる。すげぇ人が作ったすげぇガベージコレクタを、みんなで使った方が効率いいよね?ということ。
無論、標準ではGCが存在しないC言語もライブラリを使えば利用可能である。
欠点
ただし、欠点もある。ガベージコレクタが動くとき、ガベージコレクタ自身がCPUを消費してしまう。アルゴリズムにも寄るが、ガベージコレクタはプログラムが使用しているメモリ全体をチェックするため、非常に負荷がかかる。また、ガベージコレクション処理が完了する時間も一般的なGCでは予測できない。(予測可能なアルゴリズムもあるにはある)
メモリ管理をプログラマが意識しないのと同じように、プログラマはガベージコレクタを細かく制御できない。そのため、予測しないタイミングでCPUに高負荷がかかり、本来のプログラムの実行に処理が回らないといったことが起きる可能性がある。このため、リアルタイム性が要求されるプログラムには不向きと言われる。
注意事項
プログラムコードが、不要な保存域を参照し続けるようなつくりになっていると、せっかくのガベージコレクションも役に立てない。例えば、C#によるGUIプログラミングにおいて、Formのメンバ変数が膨大なDictionaryを持ち続けているであるとか、Javaによるサーバサイドプログラミングにおいて、HttpSessionへsetAttributeなどでどんどん値を追加していくとか、そのような実装を行っている場合、たとえその内容が使用されないものであったとしても、ガベージコレクタはこれらの領域が不要であると判断することができず、従来のメモリリークと同様の現象が発生する。
歴史
BASICやFortranなどの、古い高級言語には独自のメモリ管理機構があった。これをガベージコレクションと呼ぶかどうかは分からない。
ガベージコレクタが初めて実装されたのは、Lisp言語だといわれている。ただし、当時のコンピュータ性能ではガベージコレクション機能は荷が重く、実用にはならなかった。研究機関や教育機関では利用されていたが、一般への普及にはコンピュータ性能が上昇するのを待たなければならなかった。
90年代後半になるまで、開発言語はC/C++が一般的であり、ガベージコレクションはそもそもない(C)か、あるにはあるがまともに使えなかった(C++のauto_ptr。現在はshred_ptrとweek_ptrなどでそれなりにまともに扱える)。
Java言語が光を浴びると、JavaVMに搭載されたガベージコレクションが有名になった。当時主流だったC/C++のスタイルを受け継ぎ、言語的にもすっきりさせたJavaは、多くの言語に影響を与えた。Javaの影響を受けC#が作られた。
一方でPerlなどスクリプト言語は当初からガベージコレクタを持っている。これは、スクリプト言語自体がメモリ管理といった面倒ごとからプログラマを解放することを目的として作られているからだ。同類のJavaScript、PHP、Ruby、Pythonなども同様の思想と共に、ガベージコレクタを受け継いでいる。
現在では、C#やJava、Objective-Cといった、性能が潤沢なコンピュータ向けの言語はガベージコレクタを持つようになる傾向にある。一方で、携帯電話やゲーム機といった、性能が低いコンピュータや、処理性能を必要とされる環境では、依然ガベージコレクタを使わない状態が続くと思われる。
付加機能
動的メモリ領域の断片化(フラグメンテーション)に対する再配置機能も含めて、ガベージレコクションと呼ばれることもある。
不幸な実装例
携帯電話に搭載されるiアプリ、Javaアプリでは、Java言語が使われている。
しかし、前述のようにガベージコレクタは負荷がかかる(尤も処理系の実装にもよる)ため、高速な処理を必要とするゲームなどでは、本来の意図とは逆に、ガベージコレクタを動かさない、或いは指定したタイミングのみで動かすようなプログラム設計が必要になっている。
関連動画
関連書籍
関連項目・外部サイト
- C#
- JAVA
- D言語
- プログラミング関連用語の一覧
- GCアルゴリズム詳細解説
- 日本語でGCについてまとめてあるサイト
http://dic.nicomoba.jp/k/a/%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3


ページ番号: 458904
リビジョン番号: 1303447
読み:ガベージコレクション
初版作成日: 08/08/13 18:06 ◆ 最終更新日: 11/09/27 04:48
編集内容についての説明/コメント: 参照カウンタはGCの一種のはず…あとほかいろいろ追加。
記事編集 / 編集履歴を閲覧 / Twitterで紹介





JASRAC許諾番号: 9011622001Y31015
ヘッダー:固定
ヘッダー:追従