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

14件
ガベージコレクション
3.3千文字の記事
  • 7
  • 0pt
掲示板へ

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

付加機能

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

関連動画

関連書籍

関連項目・外部サイト

【スポンサーリンク】

  • 7
  • 0pt
記事編集 編集履歴を閲覧

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

加藤純一 (単) 記事と一緒に動画もおすすめ!
提供: ゲスト
もっと見る

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

お絵カキコがありません

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

ピコカキコがありません

ガベージコレクション

23 ななしのよっしん
2018/04/01(日) 11:32:25 ID: I4Ois3pWtI
>>18
そこまで行くと初期じゃなくて明期や

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

そして今はゲーム開発環境められる時代ではない
👍
高評価
0
👎
低評価
0
24 ななしのよっしん
2019/01/07(月) 22:09:46 ID: 3EZjhJCgBz
最初から順を追って説明するのなら、アセンブラするときの番地定からだろうな
そもそもメモリとは土地のようなもので、住所定しないと当初は使うことが出来なかったが、やがてヒープ領域を持つ事によってCのmalloc/freeに代表される動的メモリ確保が登場して便利になり、しかし今度はメモリ解放の問題が発生する
👍
高評価
0
👎
低評価
0
25 ななしのよっしん
2019/02/01(金) 17:01:11 ID: Vpf9GyS/4q
メモリ確保自体が悪でありstaticおじさんが最終的に勝利する
👍
高評価
0
👎
低評価
0
26 ななしのよっしん
2020/05/03(日) 12:02:20 ID: aNIrISasN9
"ガベージコレクションは手動管理にべて処理が重いと思われていることが多いが、これは必ずしも正しくない。ガベージコレクション特有のコストがあるのは確かだが、そもそも手動管理用を行う場合でもメモリの確保・解法に掛かる実行コスト自体は同じなのだ。"
同じではないだろ。GCゴミ探索をしないといけないんだから、その探索コストを払わなければならない
👍
高評価
0
👎
低評価
0
27 ななしのよっしん
2020/08/07(金) 11:55:04 ID: ioxL7kY5Ju
gc
👍
高評価
0
👎
低評価
0
28 ななしのよっしん
2020/08/07(金) 11:58:03 ID: ioxL7kY5Ju
途中送信しちまった

コスト自体」がさしてるのは利用者のコストであって、GCコストはそれと分けて書かれている
この場合、メモリ解放するコストGCに登録するコスト較に限ればという話
👍
高評価
0
👎
低評価
0
29 ななしのよっしん
2020/11/19(木) 20:15:29 ID: zx9ykB+Dpb
C++とかも別にガベージ決定がゼロコストではない。sharedなら参照カウントの上げ下げが入るし、フルに手動制御してもあるメモリが必要なのかそうでないのかの制御コードが積み重なればそれなりのサイズになる。
GCはそれらを全部本線システムから独立させて一箇所にまとめてるので、ある程度複雑なものを書くのであればオーバーヘッドの「総量」に関しては意外と許容可な場合も多い。
👍
高評価
0
👎
低評価
0
30 ななしのよっしん
2021/01/06(水) 08:08:59 ID: ioxL7kY5Ju
C/C++の処理思想に慣れた人がJavaガレージコレクタに嫌な顔をするのは、まとめてやるから気をつけないとクソ重たいGC爆弾ができるというアクセスの多いWebサイト扱うとたまにあるアレだろうね。
C/C++の処理思想で使った先から明示的に解放していればいかなる確保と開放の無限ループにも耐えられるがJavaだと積もって死ぬ
人によってはJavaの方が面倒だと言って憚らない
👍
高評価
0
👎
低評価
0
31 ななしのよっしん
2022/05/08(日) 15:41:51 ID: Tzok5G7mn1
.NETGCは任意で呼び出せるのでGC爆弾を避ける為にちゃんと定期的に呼び出そうな
特にデストラクタが定義されてるDispose呼び忘れ回避の為にも
👍
高評価
0
👎
低評価
0
32 ななしのよっしん
2022/05/08(日) 19:11:09 ID: lp+7AOntjl
SwiftObjective-Cはガベコレを敢えて採用せずARC(自動参照カウント)を使っているらしいが
ARCの優位点を教えてほしい
👍
高評価
0
👎
低評価
0

スマホで作られた新規記事

こちらの記事に加筆・修正してみませんか?

画面遷移確認のための記事 健康優良児 あらそう