(有)未来検索ブラジルが運営するあらゆる言葉についての記事を閲覧・編集したり、コメントをしたりするサイトです。

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

編集

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

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

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

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

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

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

現在でもC/C++といった言には、標準状態(ライブラリを読み込まない素の状態)ではこの機は存在しない。特にC言語の場合、標準添付ライブラリでは仕様上では存在しない。
なお、このことで必然的に発生しうるメモリフラグメンテーションを解消すべく、メモリの連続未使用域の確保を行うことをガベージコレクションと呼ぶことがある。厳密にはこれはメモリコンパクションと呼び、正確とは言いがたい。ガベージコレクション実装としてメモリコンパクションの機が内包されているケースが多く、同一の意味合いで用いられることがあるので注意と理解が必要である。

利点と欠点

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

利点

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

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

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

欠点

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

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

注意事項

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

歴史

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

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

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

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

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

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

付加機能

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

不幸な実装例

携帯電話に搭載されるiアプリJavaアプリでは、Javaが使われている。

しかし、前述のようにガベージコレクタは負荷がかかるも処理系の実装にもよる)ため、高速な処理を必要とするゲームなどでは、本来の意図とは逆に、ガベージコレクタを動かさない、いは定したタイミングのみで動かすようなプログラム設計が必要になっている。

関連動画

関連書籍

関連項目・外部サイト

携帯版URL:
http://dic.nicomoba.jp/k/a/%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3
ページ番号: 458904 リビジョン番号: 1303447
読み:ガベージコレクション
初版作成日: 08/08/13 18:06 ◆ 最終更新日: 11/09/27 04:48
編集内容についての説明/コメント: 参照カウンタはGCの一種のはず…あとほかいろいろ追加。
記事編集 / 編集履歴を閲覧 /

ガベージコレクションについて語るスレ

1 : ななしのよっしん :2008/12/10(水) 12:02:27 ID: 2oeUbPZs8G
これが無いからC++はDを名乗るのを自粛したとかしないとか
2 : ななしのよっしん :2010/08/01(日) 18:46:37 ID: qWYPd2jb/S
「初期の言」にLISPは含まないんでしょうか。
それから、世の中には「実時間ごみGC」というものがあります。
3 : ななしのよっしん :2010/08/02(月) 17:52:58 ID: qWYPd2jb/S
>>2
ごみGCってなんだwww
ごみ集め」と書いた後に「GC」に書き換えようとしたら混ざってしまった。
4 : ななしのよっしん :2010/08/29(日) 19:41:51 ID: 5TxR5LXiC/
仕組みとしてはRAIIのほうが優れてると思うんだが、どうなんだろう?
5 : ななしのよっしん :2010/09/05(日) 13:09:00 ID: jJspWr62b9
確かにiアプリは驚異的に重いものがあったりするな・・・・・。

あと最近この言葉SSDの方向から聞こえてきたりするかも。
6 : ななしのよっしん :2011/05/18(水) 17:39:22 ID: 3qDRxIrjz9
>メモリの確保を人で管理するのは大変で面倒。なので、コンピュータにさせよう!という話になる。プログラマは面倒ごとをコンピュータに任せたがる人種なのだ。
これを実現するために更なる面倒を抱え込むことになるんですね、わかります。
7 : ななしのよっしん :2011/06/18(土) 12:25:45 ID: TohvZggaN8
メモリ解放ってそんなに敷居高いか?
8 : ななしのよっしん :2011/09/27(火) 03:44:30 ID: QwwH0U4fM/
>>1
おめでとう!新仕様ではスマートポインタとして入るよ!

>>4
どう書いても「とりあえずメモリリークの心配はない」とは言えないからなぁ。
GC無いとコンパイルエラーにならなくても実はメモリリークしてるとかあるじゃん。

>>6
GC実装自体はめんどいけど
多くの人は処理系を使ってるわけじゃなくすでに在る環境を使うわけで。
無いとそもそも自分でメモリの確保とか大規模なコードなら死ねる。
Google先生C++コーディングスタイルで「セキュアにならんのが怖い。いいからshared_ptr使え」って言ってるぐらいだし。
9 : ななしのよっしん :2011/10/10(月) 17:37:19 ID: zx9ykB+Dpb
重視でGC捨てる
-> チューニングでコード増える
-> 結局GCと同じぐらいの規模に…ついでにバグの量がコード量に
いわゆるグリーンパンの第10規則のパターン
10 : ななしのよっしん :2012/05/22(火) 21:59:25 ID: Dh96YluDVo
>>4 もスマポとか使ったRAIIの方が良いと思うな
もちろん向き不向きはあるだろうけど

ところでニコニコ静画()アプリが落ちるのメモリ開放が出来てない事が原因って聞いたことがあるんだが詳しい人居ない?
ページトップへ戻る