Go ランタイムでのガベージコレクションのトリガー
Go言語では、GC(ガベージコレクション)は自動的にトリガーされ、手動のプロセスは必要ありません。GC アルゴリズムとして、Go言語では、並行マークアンドスイープが採用されています。
Goランタイムが条件を満たした時に起動します。
- メモリ割り当て:Go プログラムがオペレーティングシステムにメモリ領域を要求した際に、現在の使用可能メモリが割り当て要求を満たしていない場合、使用されなくなったメモリを解放するために GC が起動します。
- メモリ使用量:Goプログラムがメモリ使用量の一定の閾値に達すると、ガベージコレクタが起動し、メモリの使用量をできる限り減らします。
- 一定時間ごとに、GCは定期的に実行され、プログラムの実行中にメモリー使用状況が適切に制御される。
GoランタイムはGCがトリガーされた際に、マーク&スイープ法を用いて利用されていないメモリを回収します。このアルゴリズムは主に、以下の2段階で構成されています。
- マークフェーズ:ランタイムシステムは、ルートオブジェクトから開始してすべての到達可能なオブジェクトを走査してマーク処理を行います。この処理は並列実行され、プログラムの実行と同時進行します。
- ガベージコレクションフェーズ:マーキングフェーズ終了後、ランタイムシステムはヒープ全体を走査し、マークされなかったオブジェクトを全て解放します。このプロセスは、ガベージコレクションが完了するまでプログラムの実行を中止します。
GC の起動も実行も自動的に Go ランタイムシステムにより行われます。開発者は特定の起動メカニズムと実行プロセスを気にする必要はありません。ただし、開発者はいくつかの環境変数とフラグを調整することで、ガベージコレクションの動作を制御して、プログラムのパフォーマンスとメモリ使用を最適化できます。