「ガベージコレクション」の版間の差分
Administrator (トーク | 投稿記録) 編集の要約なし |
|||
| (4人の利用者による、間の4版が非表示) | |||
| 1行目: | 1行目: | ||
'''ガベージコレクション''' | '''ガベージコレクション'''([[英語]]:garbage collection、略称:[[GC]])とは、[[プログラム]]で動的に確保したメモリ領域のうち、不要になったものを自動的に解放する機構のことである。 | ||
== 概要 == | == 概要 == | ||
| 6行目: | 6行目: | ||
人間は必ずミスをするものであり、たとえ[[天才プログラマー]]であっても[[プログラム]]が巨大化するにつれ、[[メモリリーク]]は必ずと言っていいほど発生する。ガベージコレクションはそのような問題を回避するために考えられたもので、[[ライブラリ]]、または[[ランタイム]]によって使い終わった[[メモリ]]を自動的に解放する機構を提供する。 | 人間は必ずミスをするものであり、たとえ[[天才プログラマー]]であっても[[プログラム]]が巨大化するにつれ、[[メモリリーク]]は必ずと言っていいほど発生する。ガベージコレクションはそのような問題を回避するために考えられたもので、[[ライブラリ]]、または[[ランタイム]]によって使い終わった[[メモリ]]を自動的に解放する機構を提供する。 | ||
[[C言語]]などで使われている[[ライブラリ]]実装のものは、[[ソースコード]]が若干煩雑になる傾向がある。なお、[[C++]]の[[Boost]]や、[[Boost]] | [[C言語]]などで使われている[[ライブラリ]]実装のものは、[[ソースコード]]が若干煩雑になる傾向がある。なお、[[C++]]の[[Boost]]や、[[Boost]]から取り込まれた[[C++11]](旧[[C++0x]])の[[スマートポインター]]はこの点が大幅に改善している。 | ||
[[.NET]]や[[Java]]、[[PHP]]で使われている[[ランタイム]]実装のものは、[[プログラム]]([[プロジェクト]])が小規模なうちは[[プログラマー]]は特に何も考える必要がなく、非常に手軽である。 | [[.NET]]や[[Java]]、[[PHP]]で使われている[[ランタイム]]実装のものは、[[プログラム]]([[プロジェクト]])が小規模なうちは[[プログラマー]]は特に何も考える必要がなく、非常に手軽である。 | ||
| 21行目: | 21行目: | ||
また、ガベージコレクションの処理が重すぎる「[[ストップ・ザ・ワールド]]」なる現象も問題となることが多い。ゴミ収集が回ってきた(動いた)瞬間に[[コンピューター]]が超高負荷になり、まるで[[フリーズ]]したかのような状態になり、処理が終わると何事もなかったかのように動き出す、というものである。 | また、ガベージコレクションの処理が重すぎる「[[ストップ・ザ・ワールド]]」なる現象も問題となることが多い。ゴミ収集が回ってきた(動いた)瞬間に[[コンピューター]]が超高負荷になり、まるで[[フリーズ]]したかのような状態になり、処理が終わると何事もなかったかのように動き出す、というものである。 | ||
この[[ストップ・ザ・ワールド]]なる現象は、24時間365日止まってはいけない[[サーバー]] | この[[ストップ・ザ・ワールド]]なる現象は、24時間365日止まってはいけない[[サーバー]]などで突如数十秒間の一時停止が発生し問題になることが多い。巨大なサーバーほどアホみたいに大量の[[メインメモリ]]を搭載している傾向があり、それに比例してガベージコレクションによる回収にも時間がかかる。 | ||
最近では[[ストップ・ザ・ワールド]]を回避する新しい方式も登場してきている。 | 最近では[[ストップ・ザ・ワールド]]を回避する新しい方式も登場してきている。 | ||
| 36行目: | 36行目: | ||
:[[マークアンドスイープ]]と[[コピーGC]]のハイブリッド方式。[[メモリ]]が使われ始めてからの経過時間や、確保されたメモリサイズなどでグループを分け(このグループを「世代」という)、それぞれに異なるGC方式を適用するというもの。 | :[[マークアンドスイープ]]と[[コピーGC]]のハイブリッド方式。[[メモリ]]が使われ始めてからの経過時間や、確保されたメモリサイズなどでグループを分け(このグループを「世代」という)、それぞれに異なるGC方式を適用するというもの。 | ||
== 主なガベージコレクション実装 == | |||
{{stub}} | {{stub}} | ||
== | ==その他== | ||
[[MonoMac]]では[[メインスレッド]]以外からSystem.GC.Collect()を呼び出しても効果がない。 | |||
必ずメインスレッドで実行する必要がある。 | |||
== 関連項目 == | == 関連項目 == | ||
| 47行目: | 49行目: | ||
{{reflist}} | {{reflist}} | ||
[[category: ガベージコレクション]] | |||