ガベージコレクションとメモリ管理
メモリ管理はプログラムがメモリを割り当て、解放する方法を統制します。ガベージコレクションは、到達不能になったオブジェクトを特定し、解放することで、メモリの再利用を自動化します。
Definition
メモリ管理とは、プログラムのメモリの割り当てと解放を指します。ガベージコレクションは、プログラムが到達できなくなったオブジェクトが占有するメモリを解放する自動的な再利用であり、プログラマが明示的な解放を行う手間を省きます。
Scope
このトピックでは、言語ランタイムにおける自動および手動のメモリ管理について扱います。具体的には、参照カウント、マーク・アンド・スイープ、コピー方式、世代別コレクション、到達可能性の追跡、およびスループット、一時停止時間、メモリオーバーヘッド間のトレードオフについてです。また、並行およびインクリメンタルなコレクタ、ならびにコレクション戦略と言語設計との関係についても論じます。
Core questions
- コレクタはどのオブジェクトがまだ必要とされているかをどのように判断するのか?
- スループット、レイテンシ、メモリフットプリントの間にはどのようなトレードオフがあるのか?
- オブジェクトを年齢別に分離すること(世代別コレクション)が効率を向上させるのはなぜか?
- インタラクティブシステムやリアルタイムシステムにおいて、コレクションによる長い一時停止をどのように回避できるのか?
Key theories
- トレース型ガベージコレクション
- マッカーシーはLispのために自動ガベージコレクションを導入し、プログラムのルートから到達可能なオブジェクトをトレースすることでメモリを再利用するという考え方を確立しました。
- 世代別コレクション
- リーバーマンとヒューイットは、ほとんどのオブジェクトが短命であることを観察し、若い世代をより頻繁に収集することを提案しました。これにより、実際にはコレクションコストが劇的に削減されます(世代仮説)。
- コレクション技術の分類
- ウィルソンと『Garbage Collection Handbook』は、参照カウント、マーク・スイープ、コピー方式、インクリメンタル、並行コレクタの設計空間と、それらのパフォーマンス上のトレードオフを体系化しています。
Clinical relevance
自動メモリ管理は、ぶら下がりポインタやメモリリークといったバグのクラス全体を排除します。これが、ほとんどの高水準言語がガベージコレクションに依存している理由です。コレクタの選択は、特にインタラクティブシステムやサーバーシステムにおいて、アプリケーションのレイテンシとスループットに強く影響します。
History
マッカーシーは1960年にLispとともにガベージコレクションを導入しました。その後、コピーコレクション(チェイニー)と参照カウントが続き、リーバーマンとヒューイットによる1983年の世代別コレクタはオブジェクトの寿命を利用しました。その後の数十年で、インクリメンタル、並行、および領域ベースのコレクタが開発され、ウィルソンの1992年の著作と2011年の『Garbage Collection Handbook』で包括的に概説されています。
Debates
- 自動コレクションと手動または所有権ベースの管理
- 設計者は、安全で便利だが一時停止やオーバーヘッドを課す可能性があるガベージコレクションと、プログラマの負担とリスクを伴うものの予測可能なパフォーマンスと低いフットプリントを提供する手動または所有権ベースの管理との間で議論しています。
Key figures
- John McCarthy
- Henry Lieberman
- Carl Hewitt
- Richard Jones
- Paul Wilson
Related topics
Seminal works
- mccarthy1960
- lieberman1983
- wilson1992
- jones2011
Frequently asked questions
- ガベージコレクタはどのオブジェクトを解放すべきかをどのように知るのですか?
- トレース型コレクタは、スタック変数やグローバル変数などの既知のルートから開始し、参照をたどって到達可能なすべてのオブジェクトをマークします。到達できなかったものは到達不能であり、再利用できます。
- 世代別ガベージコレクションはなぜ効果的なのですか?
- ほとんどのオブジェクトは割り当て後すぐに到達不能になるため、若い世代を頻繁に収集することで、ほとんどのガベージを安価に回収できます。一方、古く長寿命のオブジェクトははるかに少ない頻度でスキャンされます。