ガベージコレクション
出典: フリー百科事典『ウィキペディア(Wikipedia)』
ガベージコレクション(garbage collection; GC)とは、プログラムが動的に確保したメモリ領域のうち、不要になった領域を自動的に解放する機能である。「ガベージコレクション」を直訳すればゴミ収集になる。
なお本来の英語の発音に近い表記は「ガーベジコレクション」あるいは「ガーベッジコレクション」であると思われるが、一般には「ガベージコレクション」または「ガーベージコレクション」と表記されることが多い。
使用中の領域をまとめてメモリのフラグメンテーションを低下させる機能と併せてガベージコレクションと呼ぶ場合もあるが、厳密にはそのような機能はコンパクションと呼び、区別される。ガベージコレクションがコンパクションの機能を含むかどうかは実装アルゴリズムに依存する。(コピーGCなどでは、ガベージコレクションを実行すると併せてコンパクションも行われる仕組みになっている。)
なお似たようなものにスマートポインタ(smart pointer)というものがあるが、これはライブラリとして提供されるガベージコレクションの一種である。
目次 |
[編集] 利点と欠点
ガベージコレクションを持つ事によるメリットは以下のようなものである:
- 動的に確保したメモリ領域の全てをプログラム作成者が明示的に管理する必要がなくなり、プログラムミスによって未解放メモリが累積していくメモリリークや、使用中のメモリを解放してしまうミスを防ぐ有効な手段となる。
- 明示的な管理が必要な状態では利用しづらいプログラミングスタイル(サブルーチン内で動的に確保されたオブジェクトを呼び出し元に戻す、型変換などのために一時的なオブジェクトを生成するなど)をとることが容易になる。
- 一般的な状況ではむしろ性能が向上する。
最後の項目は一見直感に反するが、メモリ管理を自動化する事で制御用のコードが不要となりそれ自体コードサイズの縮小につながる事、また負荷の低いときに資源を回収できるため、性能が平均化するという事実による。
その一方、ガベージコレクションはコストがかかる処理であり、一旦始まるとCPUを長時間占有する。また、ガベージコレクションが起きるタイミングや占有時間の事前予測が困難なため、リアルタイムシステムには向いていない。
マルチスレッドを利用したプログラミングでは、参照カウントを含め、何らかのガベージコレクションを使わないと、スレッド間で共有しているメモリやオブジェクトの解放が難しい場合が多い。
[編集] 実装
ガベージコレクションは、言語処理系に組み込まれたものと、ライブラリとして提供されるものがある。
不要になったメモリ領域を検出するアルゴリズムには、以下のようなものがある。
世代別ガベージコレクションのように、アルゴリズムを複合して用いるものもある。
[編集] GCを実装した言語・処理系の例
- ActiveBasic (Ver5.0~)
- ActionScript (Flashプレーヤ5以降)
- Delphi
- D言語
- Java
- JavaScript
- LISP
- MS-BASIC
- .NET Framework
- Perl
- Python
- Ruby
- Smalltalk
[編集] ライブラリ
- Boostのsmart_ptr
- Boehm-Demers-Weiser conservative garbage collector - C/C++用