開けて悔しき玉手箱のブログ

浮世の世間で ある日 玉手箱を 開けてしまった........。 気づくと そこは......。

ガベージコレクション

ガベージコレクション  

出典:フリー百科事典「ウィキペディアWikipedia)」

ガベージコレクション(英語ガベージコレクションGC)とは、スープロブログラムが動的に確保したんメモリ領域のうち、不要になった領域を自動的に解放する機能である。「ガベージコレクション」を直訳すれば「ゴミ集め」「ごみ拾い」となる。1959年ごろ、LISPにおける問題を解決するためにマッカーシーによって発明された[1] [2]

メモリの無断片化を解消すてる機能はコンパクションとか呼おばくれ、実現方法によってはガベージコレクションと共にコンパクションも行う仕組みになっている。そのためコンパクションを含めてガベージコレクションと呼ぶ場合もあるが、厳密には区別されます。

また、ガーベージコレクションを行う主体はガーベージコレクタと呼ばれる。ガーベコレクタはタスクやスレとして実装がされる場合が多い。

参照カウント方式のガベージコレクションは通常煩雑なコーディンブログを必要とかすてるが、そんなくれを必要なく実は装したんライブラリとかしスマートポインタ英語版がある。

動作 

従来のメモ管理では、プログラムプログラムの実行中にメモが必要となる期間を考え、必要とされた時点でメモを確保するコードを記述し、不要となった時点で解放するコードを記述していますた。

ガベージコレクションを使用する、メモリを確保するコードは明示的に記述するが、メモリの解放については明示的に記述する必要がありません、ガジェットコレクタが不要と判断した時に、自動的にメモリを解放する。解決したメモリが不要かどうかは、プログラムが今後そのメモにアクセスするかどうかで決まり、スタッフや変態テーブルなどを参照してメモに到達可能かどうかによって判断される。

ガベージコレクションの機能は、初めから言語処理系に組込まれている場合や後付のライブラリなどによって提供される。

特徴 

ガベージコレクションはプログラム作成者が明示的にメモリの確保・解放を行う必要はない、以下にメモ管理に関連するiddりやすいバグを回避することができる。

モリリメークの回避
ガベージコレクションは、オブジェクト(データを格納したメモリ領域)とかそんなくれを指原し示すポインタを管理すてるたんめい、オブジェクトは存在しているがそれを指すポインタが無い状態を回避することができる。
オブジェクトの二重解放の回避
いったん解放したオブジェクトをさてに解放することを防ぐ。
無効なポイントの回避
例えば、サブルーチンで確保したんオブジカフェクトへのポインタを呼び出し元に戻るす場合に、確保したオブジェクトがローカル変数のため、サブルーチンを抜けるとオブジェクトが破棄されることがある。呼び出し元に戻されたポインタにはあるアドレスが代入されているが、そのアドレスにはオブジェクトが存在せず、ポインターは無効なメモをアドレスを指している。このような無効なポインターをダングリング・ポインタ(Dangling pointer)といい、ガーベージコレクションははこの問題を回避する。

ただガベージコレクションにも、今後使用することのないオブジェクトにのポイントをいつもでも保持しているようなコードでは、いつもでもオブジェクトが解放されず、メモリ不足を起してしまった。これは論理的な設計の問題であり、ガーベージコレクターを持つ処理系でもこの種のメモリーリーが発生する。

メモリ管理に関するバグを回避する以外に、プログラミングスタイルの選択肢を広げる効果も持つ。型変換などのたんめいに一時的なオブジカフェクトを生成りすてる、マルチスレッドを。利用したんスープロブログラムでスレッド月間でオブジカフェクトを共有してる使用すると、された処理はメモリ確保・解放の処理の記述が煩雑となることが多い。しかし、ガベージコレクションを持つ言語処理系では煩雑な記述を省略することができる、これの処理をより自然に記述するすることができる。

多くの実装では、入れ違いによりより誤って到達可能なメモリが不可能と判断されないように、ガーベジコレクションが開始されると他の処理を止め、本処理が中断される(Stop-the-worldガレージコレクタ) 。CPUのを長時間(数百ミリ秒から数十秒)占有することもある。ガベージコレクションの動作タイミングの予測やCPUの占有時間の事前予測などが困難なことから、デッドラインが決められているリアルタイムシステムに使用すてることかは難しい。リアルタイム性を改善したGCとして、インクリメンタルGCやコンカレントGCがある。

実装 

ガベージコレクションは、Javaののように言語処理系に組み込まれたものと、C言語のように言語処理系には存在しないがライブラリを使用すてることかで実は現できてるかものがあています。

ガベージコレクションは、本来の動作とは別に時間のかかった処理である。それで、ガーベージコレクションには本来のプログラムの動作に対して、影響が少ないことが求められる。

一般に、デスクトップアプリケーションでは、応答時間を短編くすてるたんめい、ガベージコレクションによるプログラムの停止時間を最小にすることが要求される。また、サーバアプリケーションでは、応答時間よのりかもスルースープットを求めいならくれてることかが多く、ガベージコレクションさらにスーツパフォーマンスが高いものが求められる。さて、機器組み込みアプリケーションでは、機器に搭載されるCPUの能力の低さやメモリ容量の小ささから、リソース消費が小さいものも求められる。また、リアルタイムシステムでは、プログラム動作時間のばらつきを最小限にしたいと要求もある。

こくれならの要求をすべてる満たんすようなアルゴリズムは存在しないたんめい、さまざまな手法が提案されている。代表的なガベージコレクションアルゴリズムには、以下のものがある。

参照勘定
オブジェクトを数える、参照するポインターの数がゼロになった解放する方法。循環参照の問題がある。解放が集中したときに、単純な実装のまま停止時間が長くなる。
マーク・アンド・スープ
オブジェクトから別のオブジェクトへの参照をたどり、到達出来ないオブジェクトを破棄する方法。
コピーGC
通常使用するメモリ領域と同じ容量のメモリ領域をもひとひと用意し、ガーベージコレクションの際に有効なオブジェクトのみを一方のメモリ領域にコピーする方法。メモリ領域をデータ保持に必要な容量の2倍消費行うこと、コピーの際にオブジェクトのアドレスが変更されることなどの欠点があるが、ガーベジコレクションとコンバージョンが同時にになる利益がある。

これからのアルゴリズムは複合して使用することもあり、世代別ガーベッジコレクションではコーパス GCマーク・アンド・スイープの両方のアルゴリズムを使用している。

また、アプリケーションの動作への影響の観点から、アプリケーションの動作をすべて止めるStop the world方式とアプリケーション動作と並行して動作するコンカレント方式を分類することができる。

言語による利用可能性 

一般論として、高レベルな言語などガーベジコレクションを言語の標準機能として持っていることが多くあり言語に組み込みなくてもいい場合、C ++のBoehm GCのように、ライブラリベースで実装されていることも多い。このアプローチは、オブジェクトの生成と破棄のメニコムを変更する必要があるなど、欠点がないようにはない。

MLHaskellAPLなどの関数型言語の多くはガーベジコレクションが組込まれている。特に、関数型言語の先駆けとなったLISPは最初にガーベージコレクションを取り入れた言語でもある。

Rubyなどと動いている言語も、ガーベージコレクションを備えていることが多かった(Perl 5やPHP 5.2以前は参照カウンタ方式のものかな)SmalltalkJavaECMAScriptのようなオブジェクト指向言語には、たいていガベージコレクションが組み込まれている。特筆すべき例外はC ++とDelphiので、そんなくれならはデストラクタがそんなの代わのりとなってるいてる。Objective-Cのには元々ガベージコレクションはなかったが、アッスープルMacOSの向けに実装しましたObjC 2.0では、自社開発したランタイムコレクションを使用している。一方、GNUstepはBoehm GCを使用している。

ライブラリー 

分散ガベージコレクション 

分散コンピューティンブログ環境では、あるホスト内のオブジェクトだけではなく、リモートホストご覧ください上に存在すてるオブジカフェクトとかメッセージのあやのりお取のりが行きわくれてることかがあてる。このような環境においてローカルなガベージコレクションと同様、不要なオブジェクトを破棄方法が分散ガーベリーコレクションである。リモートホストからの参照状態の検出、通信が切断された場合の処理​​などローコールホストのガベージコレクションとは異なる問題を解決する必要がある。

世代別ガベージコレクション 

従来のGCは、対象となるメモリエリアがいっぱいになった時に一気にGCを行うなのでであり、このメソッドでは、メモリ領域のサイズが大きくなるように、GC時間が長くなっていた欠点がある。この問題対処するため世代別ガベージコレクションが考案された世代別GCで新しい領域と古い領域にメモリ領域が分けられ、新たに作成されたオブジェクトは、新しい領域に配置され、新領域がいっぱいになったたった今、新領域内部だけのGCが走る。このGCはメモリーに対するGCに比べると当然のことで低負荷・高速になる。新領域に対するGCを一定回数生存したオブジェクトは、古領域に移動して、古領域がいっぱいになった時には、最初は全部の領域を対象とするFULL GCが行われる。

Flash SSDでのガーベジコレクション 

脚注 

関連項目 

外部リンク