はじめに
Goで開発しているとたまに「GC(Garbage Collection)」という言葉を耳にすることありますよね。
でも正直、仕組みまでちゃんと説明できる人って少ない気がします。自分もその一人でした。
「GCってなんか頑張ってくれてるやつでしょ?」
「Green Tea GCって最近聞くけど、お茶なの?GCなの?」
そんな“ふわっとした印象”や“ちょっとした疑問”を整理するために、社内勉強会で発表してみました🍵
せっかく40枚以上もスライドを作ったので、Qiitaにも共有します!
「GCよく分からんけどちょっと知りたい」という人向けです 🙌
発表スライド
発表内容
ここでは概要だけ紹介します。
より詳しい図解や解説は、発表スライドをご覧ください👆
1. GCの基礎知識
- GCとは何か、なぜ必要なのか
- ルートセット、スタック/ヒープ、STWなどの基本概念
- メモリ構造の図解
2. GoのGC実装
- Mark & Sweepアルゴリズム
- Tri-color Marking
- Concurrent Mark & Sweep
(スライドではフェーズごとの図解を載せています)
3. 現在のGCの課題
- キャッシュヒット率の低さ
- メモリアクセスの非効率性
- ハードウェアトレンドとのミスマッチ(Memory Wall問題)
4. Green Tea GCのアプローチ
- スパンベーススキャニングの仕組み
- なぜキャッシュヒット率が向上するのか
- メモリトポロジー最適化(NUMA対応、8KiBアライメント)
- 実装状況と今後の展望
5. 参考:Ruby/PythonのGC
- 各言語のGC方式の比較
- パフォーマンス比較表
まとめ
- GCの基礎
- 不要メモリの自動回収で安全・効率的な開発を実現
- GoのGC実装
- Concurrent Mark & Sweep(低レイテンシー)
- Green Tea GC
- オブジェクト単位ではなくメモリブロック(スパン)単位でスキャンする
- キャッシュヒット率の向上
- Go 1.25で実験的に利用可能(GOEXPERIMENT=greentea)
- 今後はGreen Tea GCの実用化に期待
参考文献
発表資料にも記載していますが、主な参考文献は以下の通りです:
- Green Tea GC - GitHub Issue #73581
- golang/go - GitHub
- Go 1.25 Release Notes
- We tried Go's experimental Green Tea garbage collector and it didn't help performance
- Qiita: Goのガベージコレクション
- Speaker Deck: The Current Status of Green Tea GC
- Medium: Green Tea Garbage Collector
おわりに
勉強会では「GC全然わからん」だった人が「GCちょっとわかる!」になったり、
「今までふーんって感じのものに温度が乗った気がする」という感想をもらえたりして、やってよかったな〜と思いました。
自分自身も調べる中でGCのアルゴリズムやCPUキャッシュ、メモリアクセスの最適化といった低レイヤーに触れられて、とても勉強になりました。
この記事を読んだ方も「GCってちょっと面白いかも」と思ってもらえたら嬉しいです 🙌
ここまで読んでいただきありがとうございました!