メモリ管理の基本
スタック (Stack)
- 関数呼び出しやローカル変数の保存に使われる領域
- 高速にアクセスでき、関数のスコープが終了すると自動で解放される
ヒープ (Heap)
- 長期間保持されるデータや動的に割り当てられるメモリに使われる領域
- 手動または自動で解放する必要がある
ガベージコレクション
ガベージコレクション (GC) とは、プログラムが不要になったメモリ領域(ヒープ)を自動で解放する仕組みです。これにより、メモリリークを防ぎ、効率的なメモリ利用を実現します。
メリット:
- 開発者が手動でメモリ解放を行う必要がないため、コードの安全性と可読性が向上
- メモリリークの発生を防ぎやすい
デメリット:
- GCの実行中にわずかなパフォーマンス低下が発生する可能性がある
- 高負荷なリアルタイムシステムでは、GCがボトルネックになる場合がある
Goでのメモリ管理とGCの確認
package main
import (
"fmt"
"runtime"
)
func main() {
// メモリ使用量を表示する関数
printMemStats := func() {
var m runtime.MemStats
runtime.ReadMemStats(&m)
fmt.Printf("メモリ使用量: Alloc = %v KB\n", m.Alloc/1024)
fmt.Printf("GCの回数: NumGC = %v\n", m.NumGC)
fmt.Println("-------------------------------")
}
// メモリ使用量を初期表示
fmt.Println("初期状態:")
printMemStats()
// ヒープメモリを割り当てる
fmt.Println("メモリを割り当て:")
slice := make([]byte, 1024*1024)
for i := range slice {
slice[i] = byte(i % 256)
}
printMemStats()
// ガベージコレクションを強制的に実行
fmt.Println("GCを強制的に実行:")
runtime.GC()
printMemStats()
}
初期状態:
メモリ使用量: Alloc = 64 KB
GCの回数: NumGC = 0
-------------------------------
メモリを割り当て:
メモリ使用量: Alloc = 1088 KB
GCの回数: NumGC = 0
-------------------------------
GCを強制的に実行:
メモリ使用量: Alloc = 63 KB
GCの回数: NumGC = 1
-------------------------------