Go 1.26の新GC「Green Tea」をヒープ観察で検証

原題: Watching Go's new garbage collector move through the heap

なぜ重要か

GoのデフォルトGC刷新はサーバーサイドアプリケーションのレイテンシやメモリ効率に直結し、Go採用企業のインフラコスト最適化に影響する重要な変更点だ。

2026年にリリースされたGo 1.26では、Go 1.25で導入された新しいガベージコレクター「Green Tea」がデフォルトとなった。技術ブログ「The Consensus」は2026年7月19日、perf等のツールを用いてGreen Teaのキャッシュフレンドリーなヒープ動作を可視化し、非移動型コレクターが抱えるスパースページ問題も合わせて検証した記事を公開した。

Go 1.25で初めて導入された新しいガベージコレクター「Green Tea」は、Go 1.26で正式にデフォルトGCとして採用された。エンジニアのPhil Eaton氏が執筆した本記事では、Green Teaの動作原理と実際のパフォーマンス特性を、実測データと可視化を通じて詳しく解説している。

Goのメモリ管理は、同一サイズクラスのオブジェクトを連続したチャンク(スパン)内に配置するサイズ分離アロケーション方式を採用している。オブジェクトのサイズは最も近いサイズクラスに切り上げられ、スパンは1つ以上の8KiBページで構成される。この設計はGoのアロケーターの前身であるtcmallocでも採用されている手法だ。

記事では、Small(32バイト)、Medium(64バイト)、Large(128バイト)の3種類のオブジェクトを100個ランダムにアロケートし、ヒープアドレスを32バイト単位で走査してオブジェクトの配置を可視化するプログラムをGoとC#の両方で実装・比較している。GCトリガー前後のヒープレイアウトも観察し、Goの非移動型コレクターの特性を実証している。

Green Teaが最も効果を発揮するプログラムは、キャッシュフレンドリーなアクセスパターンを持つものであることも示されている。一方で、Goの非移動型コレクターが抱える課題として「スパースページ問題」が取り上げられており、オブジェクトがヒープ全体にまばらに分散している場合、GCが空きページを回収できずメモリ効率が低下するケースが存在することを具体的なコード例とともに説明している。

出典

theconsensus.dev — 元記事を読む →