差分

ナビゲーションに移動 検索に移動

ガベージコレクション

5,824 バイト追加, 2014年1月21日 (火) 03:29
ページの作成:「'''ガベージコレクション'''(英語:garbage collection、略称:GC)とは、プログラムで動的に確保したメモリ領域のうち、...」
'''ガベージコレクション'''(英語:garbage collection、略称:[[GC]])とは、[[プログラム]]で動的に確保したメモリ領域のうち、不要になったものを自動的に解放する機構のことである。

== 概要 ==
ガベージコレクションを日本語に直訳すると「ゴミ収集」である。大雑把に言えばクソみたいな[[プログラマー]]が[[メモリ]]を食い散らかしても、賢い[[コンピューター]]が勝手に掃除してくれるというもので、実世界でいうところの[[自動掃除ロボット]]の[[ルンバ]]みたいなものである。

人間は必ずミスをするものであり、たとえ[[天才プログラマー]]であっても[[プログラム]]が巨大化するにつれ、[[メモリリーク]]は必ずと言っていいほど発生する。ガベージコレクションはそのような問題を回避するために考えられたもので、[[ライブラリ]]、または[[ランタイム]]によって使い終わった[[メモリ]]を自動的に解放する機構を提供する。

[[C言語]]などで使われている[[ライブラリ]]実装のものは、[[ソースコード]]が若干煩雑になる傾向がある。なお、[[C++]]の[[Boost]]や、[[Boost]]から取り込まれたC[[++11]](旧[[C++0x]])の[[スマートポインター]]はこの点が大幅に改善している。

[[.NET]]や[[Java]]、[[PHP]]で使われている[[ランタイム]]実装のものは、[[プログラム]]([[プロジェクト]])が小規模なうちは[[プログラマー]]は特に何も考える必要がなく、非常に手軽である。

== 問題点 ==
=== タイミングが不確定 ===
ガベージコレクションは非常に便利ではあるが、全自動であるがために痒いところに手が届かないことも多い。たとえば[[画像処理]]などのように大量のメモリを必要とする[[プログラム]]では部分的に手動で解放できた方が都合の良い場合もある。

もっと具体的な例を挙げれば、[[Mac OS X]]で[[FaceTimeカメラ]]を使った[[ビデオキャプチャ]]では、1フレームごとにメモリが確保されるが、[[Objective-C]]標準のガベージコレクションに頼ると、メモリ確保を繰り返すスピードが速すぎて解放が追いつかなくなり、最終的に[[メモリ不足]]となり[[プログラム]]は[[クラッシュ]]する。実はこれ、[[アップル]]が公式配布しているサンプルプログラムに含まれる問題点で、被写体の動きが遅いと問題ないが、激しく動き続けるとダメになる。<ref>[https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/QTKitApplicationProgrammingGuide/UsingQTKit/UsingQTKit.html QTKit Application Programming Guide: QTKit Capture]</ref>

このため、[[.NET]]のように基本は全自動解放だが、手動解放(CG強制呼び出し)の手段も残している半自動なものもある。

=== ストップ・ザ・ワールド ===
また、ガベージコレクションの処理が重すぎる「[[ストップ・ザ・ワールド]]」なる現象も問題となることが多い。ゴミ収集が回ってきた(動いた)瞬間に[[コンピューター]]が超高負荷になり、まるで[[フリーズ]]したかのような状態になり、処理が終わると何事もなかったかのように動き出す、というものである。

この[[ストップ・ザ・ワールド]]なる現象は、24時間365日止まってはいけない[[サーバー]]などで突如数十秒間の一時停止が発生し、問題になることが多い。

最近では[[ストップ・ザ・ワールド]]を回避する新しい方式も登場してきている。

== 主なガベージコレクション方式 ==
ガベージコレクションと一言でいっても様々な方式や実装が発表されている。どれも一長一短はあるが、1950年代の[[LISP]]に実装された最初のガベージコレクションから日進月歩で良くなりつつある。
;[[参照カウンター]]
:メモリを使うとカウンタを+1、使い終わるとカウンタ-1、カウンタが0なら解放というシンプルな方式。[[循環参照]]によって破綻し[[メモリリーク]]が発生する。
;[[マーク・アンド・スイープ]]
:間違いなく使われている[[オブジェクト]]を[[ランダム]]でひとつ選び、そこから別のオブジェクトへと参照を次々に辿ることを繰り返し、到達出来なかったオブジェクトは使ってないと見なし破棄する方法。
;[[コピーGC]]
:通常使用するメモリ領域と同じ容量のメモリ領域をもうひとつ用意し、ガベージコレクションの際に有効な[[オブジェクト]]のみをもう一方のメモリ領域に[[コピー]]する方法。メモリ領域をデータ保持に必要な容量の2倍消費すること、[[コピー]]の際に[[オブジェクト]]の[[アドレス]]が変更されることなどの欠点があるが、ガベージコレクションと[[コンパクション]]が同時に行える利点がある。
;[[世代別ガベージコレクション]]
:[[マークアンドスイープ]]と[[コピーGC]]のハイブリッド方式。[[メモリ]]が使われ始めてからの経過時間や、確保されたメモリサイズなどでグループを分け(このグループを「世代」という)、それぞれに異なるGC方式を適用するというもの。

{{stub}}

== 主なガベージコレクション実装 ==
{{stub}}

== 関連項目 ==
*[[マネージドコード]]

== 参考文献 ==
{{reflist}}

{{stub}}
匿名利用者

案内メニュー