ヒープ上の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の正確性を保証 循環参照も正しく判定可能