ガベージコレクション 単語


ニコニコ動画でガベージコレクションの動画を見に行く

ガベージコレクション

3.1千文字の記事

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

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

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

プログラムが動作するとき、プログラムが使うデータを格納するためにメモリ領域を確保するが、プログラミングの時点でサイズが決まっていないデータ、実行中にサイズが変化するデータについては、メモリを動的に確保してデータを格納する。この動的に確保されたメモリ領域は、使用が終われば動的に解放を行わなければならない。

どのタイミング解放するかはプログラマ定するが、

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

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

利点と欠点

利点

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

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

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

関連動画

関連項目・外部サイト

この記事を編集する

掲示板

おすすめトレンド

ニコニ広告で宣伝された記事

記事と一緒に動画もおすすめ!
変態糞親父[単語]

提供: 六尺アニキ

もっと見る

急上昇ワード改

最終更新:2025/12/16(火) 07:00

ほめられた記事

最終更新:2025/12/16(火) 07:00

ウォッチリストに追加しました!

すでにウォッチリストに
入っています。

OK

追加に失敗しました。

OK

追加にはログインが必要です。

           

ほめた!

すでにほめています。

すでにほめています。

ほめるを取消しました。

OK

ほめるに失敗しました。

OK

ほめるの取消しに失敗しました。

OK

ほめるにはログインが必要です。

タグ編集にはログインが必要です。

タグ編集には利用規約の同意が必要です。

TOP