Python のガベージコレクションの仕組みは何ですか?
Pythonのガベージコレクションは、参照カウントと循環参照収集をベースにした、自動的なプロセスです。
- 参照カウント:Pythonの中の各オブジェクトには参照カウントと呼ばれる、そのオブジェクトを指す参照の数を表す値があります。オブジェクトが作られると、参照カウントを1で持っています。オブジェクトが参照されるたびに参照カウントが増え、参照されなくなると参照カウントが減ります。参照カウントが0になるとオブジェクトは誰も使わなくなっているので回収できます。
- 参照カウントが循環参照に対処できないため、Pythonでは循環参照ガベージコレクションアルゴリズムを使用しています。
マークアンドスイープ法に基づいています。
- マーキングフェーズ:グローバル変数、アクティビティスタック、常駐メモリなどのルートオブジェクトから開始し、到達性分析によりアクセス可能なすべてのオブジェクトにマーキングを実行。
- ガベージコレクションフェーズ:ヒープメモリ全体を走査し、マーキングされていないオブジェクトを消去し、スペースを再利用する。
循環参照がある場合でも、マーク型ガベージコレクションアルゴリズムでは、到達可能なすべてのオブジェクトをマークすることでアクセスされなくなったオブジェクト(つまり到達不可オブジェクト)を認識してメモリーを回収します。このため、参照されなくなった到達可能ルートからのみ参照されているオブジェクトは、最終的には回収できます。