ガベージコレクション
ガベージコレクションは、Javaのように言語処理系に組み込まれたものと、C言語のように言語処理系に組み込まれていない物がある。組み込まれていない場合は独自に記述したり、ライブラリを使用することで実現できるものがある。
ガベージコレクションは、プログラム本来の動作とは別に時間のかかる処理である。そこで、ガベージコレクションには本来のプログラムの動作に対して影響が少ないことが求められる。
一般に、デスクトップアプリケーションでは、応答時間を短くするため、ガベージコレクションによるプログラムの停止時間を最小にすることが要求される。また、サーバアプリケーションでは、応答時間よりもスループットを求められることが多く、ガベージコレクションにもスループット性能が高いものが求められる。さらに、機器組み込みアプリケーションでは、機器に搭載されるCPUの能力の低さやメモリ容量の小ささから、リソース消費が小さいものが求められる。また、リアルタイムシステムでは、プログラム動作時間のばらつきを最小にしたいという要求もある。
これらの要求をすべて満たすようなアルゴリズムは存在しないため、さまざまな手法が提案されている。代表的なガベージコレクションアルゴリズムには、以下のものがある。
いったん解放したオブジェクトをさらに解放することを防ぐ。
その処理の間、BASICがフリーズしたかのようになることから、ガベージコレクションが発生しないようにする方法として、文字列の連結を極力行わず、最大文字数が格納できる領域を持った文字列変数に対して MID$、LEFT$、RIGHT$ 関数を使用することで代用することが推奨されていた。
Objective-Cには参照カウントベースのオブジェクト寿命管理機能が組み込まれており、元々ガベージコレクションはなかったが、AppleのObjective-C 2.0では、Mac OS X 10.5以降に限り保守的な世代別GCベースのランタイムコレクタが使用可能である。ただしiOSではこのGCを利用できない。なお、macOSに関しても、NSGarbageCollectorはOS X 10.8から廃止予定扱いとなり、SDK 10.10を最後に廃止されており、またOS X 10.11を最後にこのGCは搭載されなくなり、macOS 10.12で廃止された。2015年5月以降、Mac App Storeで新規登録/更新されるアプリはGCを使えなくなっている。代替として、自動参照カウント (Automatic Reference Counting; ARC) によるメモリ管理が推奨されている。一方で、GNUstepはBoehm GCを使用している。
Pythonは主に参照カウント方式のガベージコレクションを用いているが、補助的に(伝統的なマーク&スイープとは逆順の探索アルゴリズムによる)世代別GCを併用している。
C++/CLIでは、gcnewで生成したCLIオブジェクトは.NET Frameworkのガベージコレクションにより管理される。
C++/CX(英語版)では、ref newで生成したWindowsランタイムオブジェクトはCOMベースの参照カウントにより管理される。