Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GC_Qiita

Avatar for Yporon Yporon
October 05, 2025
650

 GC_Qiita

Qiita用のGC解説スライド

Avatar for Yporon

Yporon

October 05, 2025
Tweet

Transcript

  1. G r e e n T e a G C

    へ G O か ら 学 ぶ G C
  2. GCについての前提知識 スタック・ヒープ プログラムのメモリ空間 ス タ ッ ク : 関 数

    の 実 行 に 必 要 な 一 時 的 な デ ー タ を 格 納。自動管理で高速 ヒ ープ : 動 的 に 確 保 さ れ る 大 き な デ ー タ を 格 納 。 GC が必要で低速
  3. GCについての前提知識 STW(Stop The World) GC実行中にアプリケーションを一時停止すること GC 中 に オ ブ

    ジ ェ ク ト が 変 更 さ れ る と、 正 確 な 判 定 が できない すべてを停止させて「スナップショット」を取る必要 がある
  4. GCについての前提知識 Write Barrier(書き込みバリア) 並 行 GC 中 に、 ア プ

    リ が オ ブ ジ ェ ク ト を 変 更 し た 際 に GCに通知する仕組み 詳しくは、Tri-color Markingの解説に合わせて説明 します
  5. メモリ構造とGC ルートセット プログラムのメモリ空間 スタック (Stack) main() 関数 config *Config →

    ヒープ上のConfigオブジェクト count int = 42 (プリミティブ値) users []User → ヒープ上の配列 processData() 関数 data *Data → ヒープ上のDataオブジェクト temp string = "processing" ← 現在の実行位置 スタックの特徴 • 関数の呼び出し順に積み重なる(LIFO) • 関数終了時に自動的に解放 • 高速アクセス・サイズ制限あり(通常数MB) • ローカル変数・引数・戻り先アドレスを格納 ヒープ (Heap) Config オブジェクト host: "localhost" port: 8080 db: *Database []User 配列 [0]: {name: "Alice"} [1]: {name: "Bob"} [2]: {name: "Carol"} Data オブジェクト id: 12345 content: "..." next: *Data Database オブジェクト connection: "..." pool: [...] 未参照 (ガベージ) OldData 未参照 (ガベージ) TempBuffer ヒープの特徴 • 動的にメモリを確保(new, make, malloc等) • 大きなデータ構造やオブジェクトを格納 • GCまたは手動での解放が必要 • スタックより低速だが、サイズ制限が緩い 🎯 ルートセット(GC Roots ) - ガベージコレクションの起点 1. スタック上の参照 • 実行中の関数のローカル変数 • 関数の引数 • 一時変数 例: config, users, data 2. グローバル/ 静的変数 • プログラム全体で共有 • クラスの静的フィールド • シングルトンインスタンス 例: globalCache, logger 3. レジスタ/ 実行コンテキスト • CPU レジスタ内の参照 • 実行中のスレッド状態 • Goの場合:Goroutineスタック 現在処理中の値 ⚡ なぜ重要? • これらから到達可能 = 生存 • 到達不可能 = ガベージ • GCの正確性を保証 循環参照も正しく判定可能
  6. Concurrent Mark & Sweep Tri-color Concurrent Parallel Mark&Sweep この表現の方がわかりやすいかも、並列でMarkを行う Initial

    Mark ルートセットを灰色にマーク Write Barrierを有効化 Concurrent Mark gcBgMarkWorkerが並列でヒープ領域をマーキング アプリケーションと同時実行
  7. Concurrent Mark & Sweep Mark Termination マーキング完了処理 Write Barrier無効化 Concurrent

    Sweep(並行実行) 未マークオブジェクトを解放 バックグラウンドで実行
  8. GreenTeaGCのアプローチ 🍵 従来のアルゴリズムの延長にある そ の 上 で 、 オ ブ

    ジ ェ ク ト 単 位 で は な く メ モ リ ブ ロ ッ ク (スパ ン)を処理単位とする 512バイトを超える大きなオブジェクトは、従来のア ルゴリズムで処理 1回のスキャンで得られるポインタ数が多く、スキャ ンごとのオーバーヘッドを容易に償却できるため
  9. RubyとPythonのGC(参考) Ruby 世代別Mark & Sweep インクリメンタルGCでSTWを分割(Ruby 2.2以降) Ruby 3.1以降は3世代GC Python

    参照カウント + サイクル検出 即座にメモリ解放されるが、refcount操作のオーバーヘ ッドあり
  10. まとめ GCの基礎 不要メモリの自動回収で安全・効率的な開発を実現 GoのGC実装 Concurrent Mark & Sweep(低レイテンシー) Green Tea

    GC オブジェクト単位ではなくメモリブロック(スパ ン) 単位でスキャンする 今後はGreen Tea GCの実用化に期待