編集  

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

ガベージコレクション

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

付加機能

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

関連動画

関連書籍

関連項目・外部サイト


【スポンサーリンク】

スマホ版URL:
https://dic.nicovideo.jp/t/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 リビジョン番号: 2526141
読み:ガベージコレクション
初版作成日: 08/08/13 18:06 ◆ 最終更新日: 17/09/23 15:03
編集内容についての説明/コメント: 追加した項目を削除
記事編集 / 編集履歴を閲覧

この記事の掲示板に最近描かれたお絵カキコ

お絵カキコがありません

この記事の掲示板に最近投稿されたピコカキコ

ピコカキコがありません

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

15 : ななしのよっしん :2014/10/05(日) 23:31:50 ID: Y8L6HClmMk
>>14
ゴミ擬人化して萌えるとは、なかなかの上級者とみた。
それにしても、萌えゴミ萌えないゴミの分別はどうやるんだろう。
16 : ななしのよっしん :2016/02/20(土) 17:49:49 ID: qY/BVKmoEf
トロヴストルップさんが 「c++ にはよいガベージコレクションがあるぞ、なんたってそもそもガベージをほとんど生成しないからな」とか言っていたな
http://www.stroustrup.com/bs_faq.html#really-say-thatexit
17 : ななしのよっしん :2016/11/20(日) 21:35:59 ID: 3EZjhJCgBz
ガベージコレクションは「プログラマーの品質が低くても言レベルカバーしてくれる」という趣旨の機
「Trust the programmer」から始まるCの価値観では邪魔なだけ
18 : ななしのよっしん :2017/02/04(土) 01:21:50 ID: lOzE2DnDqt
>初期の言メモリを効率的に使うため、すべてのメモリの確保と解放をプログラマ人力で管理していた。しかし、これはそれなりの技術を要するため、プログラマハードルを上げてしまっていた。
初期の言って、FORTRANCOBOLも基本的に静的メモリ確保で済ませる言だと思うけど……。どうしても記憶が足りないときはオーバーレイとかするんだと思うけど、あれはmalloc/freeみたいな生易しい代物じゃないぞ。
19 : ななしのよっしん :2017/03/24(金) 07:02:42 ID: 3EZjhJCgBz
>>18
「すべてのメモリの確保と解放」でなく「確保したすべてのメモリの解放」が適切だな
20 : ななしのよっしん :2017/04/22(土) 01:19:13 ID: sZ5HfDWHX0
C#ならusing使おうな
VSで静的コード分析かけような
21 : ななしのよっしん :2017/08/19(土) 07:45:10 ID: iBHJjJNS33
unity触る為にC#の言仕様調べてたんだけどまさかニコニコに飛ぶことになるとは思わなかったわ
しかし個人的には参考になる情報じゃなかった悲しい
22 : ななしのよっしん :2017/12/07(木) 05:18:52 ID: SCCXpnDQuH
Javaゲーム向きじゃないと言われる所以の一つ

そう思うとCはほんとマニュアルで、JavaC#といったオートマにはない利点がたくさんあるんだよなぁ、もちろんその分煩わしいけど
プログラマの腕が最も反映される言かもしれん
23 : ななしのよっしん :2018/04/01(日) 11:32:25 ID: I4Ois3pWtI
>>18
そこまで行くと初期じゃなくて明期や

>>21
参考になる情報
ガベージコレクションゲーム向きじゃない
C#もそれに依存するUnityゲーム開発環境ではない

そして今はゲーム開発環境められる時代ではない
24 : ななしのよっしん :2019/01/07(月) 22:09:46 ID: 3EZjhJCgBz
最初から順を追って説明するのなら、アセンブラするときの番地定からだろうな
そもそもメモリとは土地のようなもので、住所を定しないと当初は使うことが出来なかったが、やがてヒープ領域を持つ事によってCのmalloc/freeに代表される動的メモリ確保が登場して便利になり、しかし今度はメモリ解放の問題が発生する
急上昇ワード
ニコニコニューストピックス