Go言語ガベージコレクタの動作原理
Go言語のガベージコレクタ(GC)はGo言語ランタイムシステムの一部で、不要になったメモリの自動管理と開放を行います。
Go言語のガベージコレクタはマークアンドスイープというアルゴリズムを使用しており、その具体的なワークフローは以下のとおりです。
- マーキング段階:ガベージコレクターは、ルートオブジェクト(グローバル変数や関数パラメータなど)から再帰的に到達可能なオブジェクトをたどり、マーキングします。マーキングされたオブジェクトは、プログラムでまだ使用されており、アクティブであると考えられます。
- ガベージ コレクションがヒープメモリ全体をスキャンし、マークされていないオブジェクトをガベージオブジェクトとして解放します。このフェーズでは、マークされているオブジェクトが誤って消去されないように、新しいオブジェクトは割り当てられません。
- ガベージコレクタは掃出し段階の後、ヒープメモリを整理し、アクティブオブジェクトをすべてヒープの端に詰め、将来のメモリ割り当てに連続した領域を確保します。
Go言語のガベージコレクターは、3色マーク法を採用して並行ガベージコレクションを実現しています。具体的には、すべてのオブジェクトを 3 つの状態(白、グレー、黒)に分けます。
- 白いものは未スキャンアイテムを表します。
- グレーのオブジェクトはスキャンはしたが、その参照はまだ解決していないオブジェクトを表す。
- 黒色のオブジェクトは、読み取り済みで、参照が解決済みのオブジェクトを示します。
ガベージコレクタでは、複数のワーカースレッドが並行にガベージコレクション操作を行いながら、プログラムの実行中にはスキャン・マーク付けを行い、プログラムを停止する必要はありません。ガベージコレクタが不要になったオブジェクトを見つけると、それらを削除キューに入れ、削除フェーズで解放します。
Go言語のガベージコレクションでは、マークアンドスイープアルゴリズムが採用されており、マーク処理に3色マーク方式、ガベージコレクション処理に並行処理を利用している。この方法により、ガベージコレクション処理がプログラム実行と並行実行され、プログラムの停止時間が短縮され、性能と応答性が向上します。