ガベージコレクション
読み:ガベージコレクション
外語:GC: Garbage Collection
プログラム
で動的に確保されたデータ領域のうち、不要になったものを自動的に解放する、機能や動作。英語の原義は「ゴミ集め」。
目次
概要
機能
古代
オブジェクト指向
特徴
利点と欠点
実現方法
ガベージコレクションの方式
一括処理
リファレンスカウント
機能を持つ言語
概要
プログラミング言語
でメモリーを動的に確保した場合、いずれかのタイミングで解放する必要がある。
古くは、解放する処理をプログラマーが手動で記述することで自主的に実施する方法が取られていたが、解放忘れの「
メモリーリーク
」や、一度解放したものを誤ってもう一回解放してしまう「二重解放」などが頻発した。
そこで、インタープリター言語やスクリプト言語など、比較的モダンとされるプログラミング言語を中心として、不要となったデータ領域を自動的に解放する機能としてガベージコレクションが導入されている。
機能
古代
動的なメモリー取得機能を持った
プログラミング言語
のうち、
C
や
C++
といった言語では、確保した
メモリー
の管理は
プログラマー
がする。
すなわち、不要になったデータ領域は、プログラマーが明示的に開放する必要があった。例えばC++なら、
new
演算子
によって確保されたオブジェクトは、「必ず」
delete
演算子によって解放する必要がある。
しかしこれは往々にして遂行されず、開放が忘れられたオブジェクトはいつまでもメモリー上に残り続け、必然的に
デストラクター
も呼び出されない。これを
メモリーリーク
といい、メモリーリークが発生すると解放されないリソースが生じることになる。
メモリーリークは頻繁に発生し、かくして、プログラマーを悩ませ続けた。
オブジェクト指向
オブジェクト指向プログラミング
が主流になると、データ開放のタイミングを正しく認識し、
プログラム
でそれが正しく行なわれるよう記述する、という行為自体が難しいものとなった。
さらには、
マルチスレッド
に対応したプログラムとなると、もはや人間の理解を超えたものとなった。
そこで、近年のプログラミング言語は言語仕様でガベージコレクション機能を持たせる事が多くなったのである。
特徴
利点と欠点
利点と欠点は次の通りである。
プログラミング
が楽になり、メモリーリークが発生しない
ガベージコレクションの処理がいつ行なわれるかがわからない
そのため、いきなりパフォーマンスが低下したり、機能不全に陥ることがある
これを防ぐため、負荷が少ない時は随時ガベージコレクションを行なうものも存在する
実現方法
動的メモリーの確保時に、データ本体と別に参照情報も持たせることでデータの要不要を判定できるようにする。状況に応じて不要になったデータ領域を解放し、再び利用可能な状態にする。
不要メモリーを解放しただけでは領域が断片的に分散する形になってしまう(
断片化
)ため、データ領域を再配置して領域をまとめる機能を持っているのが普通である。
ガベージコレクションの方式
一括処理
プロセス
に割り当てられているメモリーの利用量がある一定の大きさに到達したとき、それまで確保されたメモリーに関して参照元を検索し、参照元が存在しない場合は一括してそれらを開放するもの。
ガベージコレクションの処理のため、実装にもよるが、プログラムが長時間停止する事もある(特に、シングルスレッド、シングルタスクで動作するような環境)。またこの場合、どのみち時間がかかるのならと、同時にデータの再配置を行なってしまうものも多かった。
Java
などは一括処理方式を採用しているが、ガベージコレクションは大抵の実装で別スレッドで実行されるため、止まるということは基本的にはない。
リファレンスカウント
データの
スコープ
範囲外に処理が移るなどしてデータを参照する命令が無くなった時点でそのデータが不要になったと判定して解放を行なうもの。随時処理を行なうため、ガベージコレクションのために処理を一時停止させる必要がない。
ただし、循環構造(
リンク
構造を参照し続けていくと元のデータに戻るようなデータの繋がり)のデータに対しては何らかの対策を講じる必要がある。また、逐次的に解放を行なうために断片化した領域の再配置のような機能は原理的に難しい。
Perl
や
Python
はこの方式を採用している。
機能を持つ言語
インタープリター型言語に多い。
コンパイル型言語に少ないのは、動的メモリーの確保に関して
オペレーティングシステム
の支援を直接受けるため、ガベージコレクションを実現させるのはあまり合理的でないためと考えられる。
また、.NET Framework環境では、言語仕様としてより、環境仕様としてガベージコレクションに対応している。.NET用言語は全てが対応するが、以下には主要なもののみを例示した。
BASIC
(Microsoft BASIC)
Java
Lisp
系言語
Perl
Python
Ruby
Smalltalk
.NET Framework
環境の言語
C#
Visual Basic
(Visual Basic .NET)
C++/CLI
Delphi
(通称、Delphi.NET)
再検索