ガベージコレクターの内部
三色マークスイープ、GOGC、GC停止
「ガベージコレクターの内部」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
三色マークアンドスイープ
Go の GC は、並行三色マークアンドスイープアルゴリズムを使用します。オブジェクトは、白(未訪問)、グレー(発見済みだが子要素を未走査)、黒(走査完了)のいずれかです。スイープ時に白いオブジェクトはガベージとみなされます。
並行 GC
Go の GC は、ほとんどの場合アプリケーションのゴルーチンと並行して実行されます。これにより、ほとんどのプログラムで Stop-the-World(STW)の一時停止を 1 ミリ秒未満に抑えられます。
ライトバリア
ライトバリアは、並行マークフェーズ中のポインター書き込みを介入して処理し、黒いオブジェクトが白いオブジェクトを指さないという不変条件を維持します。すべてのポインター書き込みにわずかなオーバーヘッドが加わります。
STW フェーズ
GC サイクルごとに、短い STW の一時停止が 2 回発生します。(1) マークの準備(ライトバリアの有効化、ゴルーチンスタックのスナップショット取得)、(2) マークの終了(すべてのグレーオブジェクトが走査済みであることの確認)です。P99 は通常 <1ms です。
GOGC
GC のトリガーは GOGC(デフォルト値 100)によって制御されます。これは「前回の GC 以降にライブヒープサイズが 2 倍になったときに GC を実行する」という意味です。GOGC=50 に設定すると、メモリ使用量が減る代わりに GC の頻度が増えます。GOGC=200 に設定すると、メモリ使用量が増える代わりに GC の頻度が減ります。
GOMEMLIMIT
GOMEMLIMIT(Go 1.19以降)はソフトメモリ上限を設定します。ヒープが上限に近づくと、GOGCの値にかかわらずGCがより積極的に実行されます。メモリが制約された環境でOOMキルを防ぐために使用します。
import "runtime/debug"
debug.SetMemoryLimit(512 * 1024 * 1024)ペーシング
GCは、GOGCに基づいてヒープがいっぱいになる前にマーキングを終えられるよう、実行ペースを調整します。割り当て速度が高い場合は、マーキングを支援するgoroutine(mark assists)の数を増やします。
runtime.GC()
runtime.GC()を呼び出すと、GCサイクルが直ちに強制実行されます。ファイナライザが実行されることを確認するテストや、クリーンなヒープから開始するベンチマークで役立ちます。本番環境では呼び出さないでください。
ファイナライザ
runtime.SetFinalizerを使用すると、オブジェクトがガベージコレクションされたときに実行する関数を登録できます。ファイナライザはGCの後、専用のgoroutineで実行されます。リソースの解放には使用せず、代わりにClose()メソッドを使用してください。
GCメトリクス
runtime.ReadMemStatsからGC統計を読み取るか、Prometheusメトリクスとして公開します。主なフィールドは、NumGC、PauseNs、HeapAlloc、HeapInuseです。
var m runtime.MemStats
runtime.ReadMemStats(&m)
fmt.Printf("GC cycles: %d, last pause: %dns\n", m.NumGC, m.PauseNs[(m.NumGC+255)%256])スカベンジャ
バックグラウンドのスカベンジャは、アイドル状態のヒープメモリをOSに返します。フォアグラウンドの性能に影響を与えないようペースを調整しながら、並行して実行されます。MADV_FREEまたはMADV_DONTNEEDシステムコールが使用されます。
クイックチェック
Go 1.19以降のGOMEMLIMITは何をしますか?
まとめ:GCの内部動作
重要なポイント:
- 並行トライカラー・マークアンドスイープ方式で、短いSTW停止が2回発生します
- GOGCはヒープの増加率を制御します。デフォルトは100で、100%増加するとGCが実行されます
- GOMEMLIMITはコンテナ環境でのメモリ安全性に使用します(Go 1.19以降)
- GCメトリクスにはruntime.ReadMemStatsを使用します
よくある質問
「ガベージコレクターの内部」レッスンは無料ですか?
はい。「ガベージコレクターの内部」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「ガベージコレクターの内部」で何を学びますか?
三色マークスイープ、GOGC、GC停止 ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「ガベージコレクターの内部」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。