Go言語ガベージコレクタの動作原理

Go言語のガベージコレクタ(GC)はGo言語ランタイムシステムの一部で、不要になったメモリの自動管理と開放を行います。

Go言語のガベージコレクタはマークアンドスイープというアルゴリズムを使用しており、その具体的なワークフローは以下のとおりです。

  1. マーキング段階:ガベージコレクターは、ルートオブジェクト(グローバル変数や関数パラメータなど)から再帰的に到達可能なオブジェクトをたどり、マーキングします。マーキングされたオブジェクトは、プログラムでまだ使用されており、アクティブであると考えられます。
  2. ガベージ コレクションがヒープメモリ全体をスキャンし、マークされていないオブジェクトをガベージオブジェクトとして解放します。このフェーズでは、マークされているオブジェクトが誤って消去されないように、新しいオブジェクトは割り当てられません。
  3. ガベージコレクタは掃出し段階の後、ヒープメモリを整理し、アクティブオブジェクトをすべてヒープの端に詰め、将来のメモリ割り当てに連続した領域を確保します。

Go言語のガベージコレクターは、3色マーク法を採用して並行ガベージコレクションを実現しています。具体的には、すべてのオブジェクトを 3 つの状態(白、グレー、黒)に分けます。

  1. 白いものは未スキャンアイテムを表します。
  2. グレーのオブジェクトはスキャンはしたが、その参照はまだ解決していないオブジェクトを表す。
  3. 黒色のオブジェクトは、読み取り済みで、参照が解決済みのオブジェクトを示します。

ガベージコレクタでは、複数のワーカースレッドが並行にガベージコレクション操作を行いながら、プログラムの実行中にはスキャン・マーク付けを行い、プログラムを停止する必要はありません。ガベージコレクタが不要になったオブジェクトを見つけると、それらを削除キューに入れ、削除フェーズで解放します。

Go言語のガベージコレクションでは、マークアンドスイープアルゴリズムが採用されており、マーク処理に3色マーク方式、ガベージコレクション処理に並行処理を利用している。この方法により、ガベージコレクション処理がプログラム実行と並行実行され、プログラムの停止時間が短縮され、性能と応答性が向上します。

bannerAds