ニコニコ大百科モバイル

7/2(月)よりスマホまたはPCでアクセスした場合、各デバイス向けのサイトへ自動で転送致します


ガベージコレクション


ヨミ: ガベージコレクション
掲示板をミル!
25カキコ!

ガベージコレクション(GarbageCollection)とは、動的に確保されたメモリ領域のうち、使われなくなった領域(garbage:ゴミ)を自動的に収集(collection)して解放する機。ガベージコレクションを行うモジュール実装)の事をガベージコレクタ(GarbageCollecter,GC)と言う。

ガベージコレクションは言や標準ライブラリOSといった環境に組み込まれて提供される。


ガベージコレクションの必要性


プログラムが動くとき、プログラムが使うデータを格納するためにメモリを確保する。格納する量が決まっていないときや、実行中に格納する量を変える必要があるとき、メモリ動的に確保する。ここで言う動的とは、設計時(プログラムを書いているとき)には確保する量が決められなず、実行時に量が決まるすることをす。

通常、動的に確保されたメモリ領域は、動的に解放を行う必要がある。これを、行わないと使わないのに確保されたままの領域(=メモリリーク)が発生し、利用できるメモリが減っていく。メモリが少なくなると、システムが重くなったり、不安定になる。ひどければアプリケーションの起動ができなくなることもある。

初期の言メモリを効率的に使うため、すべてのメモリの確保と解放をプログラマ人力で管理していた。しかし、これはそれなりの技術を要するため、プログラマハードルを上げてしまっていた。

現在でもC/C++といった言には、標準の言仕様ライブラリを除いた言自体の仕様)ではこの機は存在しない。特にC言語の場合、標準添付ライブラリでは仕様上では存在しない。

なお、このことで必然的に発生しうメモリフラグメンテーションを解消すべく、メモリの連続未使用領域の確保を行うことをガベージコレクションと呼ぶことがある。厳密にはこれはメモリコンパクションと呼び、正確とは言いがたい。ガベージコレクションの実装としてメモリコンパクションの機が内包されているケースが多く、同一の意味合いで用いられることがあるので注意と理解が必要である。


利点と欠点


メモリの確保を人力で管理するのは大変で面倒。なので、コンピュータにさせよう!という話になる。プログラマは面倒ごとをコンピュータに任せたがる人種なのだ。


利点


この動的に解放を行うという事を、プログラマが意識しなくてよいように、言や標準ライブラリに組み込まれたがガベージコレクションと呼ばれる機である。これによってプログラマは、メモリの解放を意識せずにたくさんのメモリをより自由に使えるようになった。また、プログラミングの敷居を下げた。

また、個々のプログラマが独自にメモリ管理を行う代わりに、ガベージコレクションを環境セットにして実装し他のプログラマ提供することで、より洗練された高速なガベージコレクション機の恩恵を多くのプログラマが受けることにもなる。すげぇ人が作ったすげぇガベージコレクタを、みんなで使った方が効率いいよね?ということ。

論、標準ではGCが存在しないC言語ライブラリを使えば利用可である。


欠点


ただし、欠点もある。ガベージコレクタが動くとき、ガベージコレクタ自身がCPUを消費してしまう。アルゴリズムにも寄るが、ガベージコレクタプログラムが使用しているメモリ全体をチェックするため、非常に負荷がかかる。また、ベージコレクション処理が了する時間も一般的なGCでは予測できない。(予測可アルゴリズムもあるにはある)

メモリ管理をプログラマが意識せずに済むことの対価として、プログラマガベージコレクタを細かく制御できない。そのため、予測しないタイミングCPUに高負荷がかかり、本来のプログラムの実行に処理が回らないといったことが起きる可性がある。このため、リアルタイム性が要されるプログラムには不向きと言われる。


よくある誤解


ガベージコレクションは手動管理にべて処理が重いと思われていることが多いが、これは必ずしも正しくない。ガベージコレクション特有のコストがあるのは確かだが、そもそも手動管理用を行う場合でもメモリの確保・解法に掛かる実行コスト自体は同じなのだ。例えば、プログラムアイドル状態の時にGCを行うといった最適化が行われれば全体的なは向上する可性がある。また、別スレッドにおいてメモリの管理を行うことで性低下をど起こさないようにGCを行える場合もあるだろう。(これらが可かどうかはプログラムの動作や、メモリがどのように使用されているか、そしてGCの性に依る)

では何故ガベージコレクションに重いが付きまとうかというと、欠点の項にあるように一度動き出すとその時にまとめて負荷が掛かる傾向があるためである。つまりこれゴミはこまめに捨てたほうが良いのか、普段は貯めておいてたまに大掃除をした方が良いのかということであり、プログラムの性が途中で変動して問題ないのかどうかにかかってくる。

というわけで「負荷軽減のために手動管理する」というのは正しい理解ではないことを覚えておきたい。時に手動管理する方が有利なのは、あくまでその方が動きを予測できるからなのだ。


注意事項


メモリ領域を参照するポインタの数を監視し、これがゼロになった領域を不要な領域として解放していく手法を中心とすることが多いが、プログラムコードが、不要な保存域を参照し続けるようなつくりになっていると、せっかくのガベージコレクションも役に立てない。

例えば、C#によるGUIプログラミングにおいて、Formのメンバ変数が膨大なDictionaryを持ち続けているであるとか、Javaによるサーバサイドプログラミングにおいて、HttpSessionsetAttributeなどでどんどん値を追加していくとか、そのような実装を行っている場合、たとえその内容が使用されないものであったとしても、ガベージコレクタはこれらの領域が不要であると判断することができず、従来のメモリリークと同様の現が発生する。


歴史


BASICFortranなどの、古い高級言には独自のメモリ管理機構があった。これをガベージコレクションと呼ぶかどうかは分からない。

ガベージコレクタが初めて実装されたのは、Lispだといわれている。ただし、当時のコンピュータではガベージコレクション機は荷が重く、実用にはならなかった。研究機関教育機関では利用されていたが、一般への普及にはコンピュータが上昇するのを待たなければならなかった。

90年代後半になるまで、開発言はC/C++が一般的であり、ガベージコレクションはそもそもない(C)か、あるにはあるがまともに使えなかった(C++auto_ptr。現在shared_ptrとweak_ptrなどでそれなりにまともに扱える)。

Javaを浴びると、JavaVMに搭載されたガベージコレクションが有名になった。当時流だったC/C++スタイルを受け継ぎ、言的にもすっきりさせたJavaは、多くの言に影を与えた。Javaの影を受けC#が作られた。

一方でPerlなどスクリプト言語は当初からガベージコレクタを持っている。これは、スクリプト言語自体がメモリ管理といった面倒ごとからプログラマを解放することをとして作られているからだ。同類のJavaScriptPHPRubyPythonなども同様の思想と共に、ガベージコレクタを受け継いでいる。

現在では、C#JavaObjective-Cといった、性が潤沢なコンピュータ向けの言ガベージコレクタを持つようになる傾向にある。一方で、携帯電話ゲーム機といった、性が低いコンピュータや、処理性を必要とされる環境では、依然ガベージコレクタを使わない状態が続くと思われる。


付加機能


動的メモリ領域の断片化(フラグメンテーション)に対する再配置機も含めて、ガベージレコクションと呼ばれることもある。


関連動画



■sm3740599[ニコ動]

■sm2486243[ニコ動]


関連書籍


■az4798025623


関連項目・外部サイト



最終更新日: 17/09/23 15:03
タグ検索 パソコン版を見る


[0]TOP
ニコニコ動画モバイル
運営元:ドワンゴ