Go 1.26:新GC「Green Tea」のヒープ動作を観察
Original : Watching Go's new garbage collector move through the heap
Pourquoi c'est important
GoのGC進化はサーバーサイドアプリのレイテンシとメモリ効率に直接影響する。
Go 1.26でデフォルトとなった新ガベージコレクター「Green Tea」について、perfツールとヒープ可視化プログラムを用い、キャッシュ効率とスパースページ問題を実証的に検証した技術解説が公開された。
Go 1.25で導入され、Go 1.26でデフォルト化された新しいガベージコレクター「Green Tea」の動作を、実際のコードと計測ツールで検証する技術記事が公開された。
Goのメモリ管理は、同一サイズクラスのオブジェクトを8KiBページ単位の連続チャンク(「スパン」)にまとめて配置するサイズ分離アロケーション方式を採用しており、これはGo allocatorの元となったtcmallocと同様のアプローチだ。
記事では32・64・128バイトの3種類のオブジェクトを100個ランダムに確保し、ヒープアドレス空間を32バイト単位で走査して配置パターンを可視化するプログラムをGoおよびC#で実装している。GCトリガー前後を比較することで、Goが「非移動型コレクター」であるため、GC実行後もオブジェクトの位置が変わらない点を実証する。
Green Teaの主な改善点はキャッシュフレンドリーなスキャン処理にあるが、非移動型の制約上、ライブオブジェクトが散在するスパースページのメモリは回収できないという既知の問題(「スパースページ問題」)も残ると指摘している。