ヒープとメモリ割り当てのプロファイリング
ヒーププロファイルでメモリ使用の集中箇所を見つけます。
「ヒープとメモリ割り当てのプロファイリング」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
ヒーププロファイリングが必要な理由
過剰なメモリアロケーションは、GCの負荷によってGoプログラムを遅くします。ヒーププロファイリングを使うと、どのコードパスが最も多くのメモリを割り当てているかが分かるため、アロケーションを削減できます。
ヒーププロファイルの取得
HTTPエンドポイント経由(net/http/pprofが必要です):
go tool pprof http://localhost:6060/debug/pprof/heapファイルベースのヒーププロファイル
runtime/pprofを使うと、任意の時点でヒーププロファイルを書き出せます:
f, _ := os.Create("mem.prof")
pprof.WriteHeapProfile(f)
f.Close()Inuseとallocの違い
ヒーププロファイルには2つのビューがあります。inuse_objects/inuse_spaceは現在使用中のもの、alloc_objects/alloc_spaceは開始以降の合計を表します。アロケーションが集中しているパスを見つけるにはalloc_spaceを使います。
go tool pprof -alloc_space http://localhost:6060/debug/pprof/heapgo test -memprofile
ベンチマーク中にメモリプロファイルを取得します:
go test -memprofile mem.prof -benchmem -bench=BenchmarkProcess ./...MemStats
実行中の監視に利用するため、プログラムからランタイムのメモリ統計情報を読み取ります:
var ms runtime.MemStats
runtime.ReadMemStats(&ms)
fmt.Printf("Alloc: %v MiB\n", ms.Alloc/1024/1024)
fmt.Printf("NumGC: %v\n", ms.NumGC)エスケープ解析
ヒープにエスケープする変数はアロケーションを引き起こします。go build -gcflags=-mを実行すると、どの変数がなぜエスケープするのかを確認できます。
go build -gcflags="-m -m" ./...
// main.go:12:15: &User{...} escapes to heapアロケーションの削減: 事前確保
最終的な長さが分かっている場合は、make([]T, 0, n)でスライスを事前確保します。これにより、スライスの拡大に伴う繰り返しの再確保を避けられます。
results := make([]Result, 0, len(input))再利用のためのsync.Pool
sync.Poolを使って再利用可能なオブジェクト(バッファーや一時的なスライス)をプールし、アロケーションのコストを分散させます:
var pool = sync.Pool{
New: func() any { return new(bytes.Buffer) },
}
buf := pool.Get().(*bytes.Buffer)
buf.Reset()
// use buf...
pool.Put(buf)値レシーバーとポインターレシーバー
大きな構造体を値で渡すと、呼び出しのたびにコピーされます。コピーを避けるにはポインターで渡しますが、ポインターによって値がヒープにエスケープする可能性がある点に注意してください。
Stringと[]byte
stringと[]byteの変換ではアロケーションが発生します。処理のホットパス全体で[]byteを使い、stringが必要になる境界でのみstringに変換します。
クイックチェック
pprofのヒーププロファイルで-alloc_spaceは何を示しますか?
まとめ: ヒーププロファイリング
重要事項:
- -alloc_spaceは合計アロケーション、inuse_spaceは現在使用中の領域を示します
- go build -gcflags=-mでエスケープ解析の結果を確認できます
- スライスを事前確保し、頻繁に再利用するものにはsync.Poolを使います
- プログラムからの監視にはruntime.ReadMemStatsを使います
よくある質問
「ヒープとメモリ割り当てのプロファイリング」レッスンは無料ですか?
はい。「ヒープとメモリ割り当てのプロファイリング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「ヒープとメモリ割り当てのプロファイリング」で何を学びますか?
ヒーププロファイルでメモリ使用の集中箇所を見つけます。 ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「ヒープとメモリ割り当てのプロファイリング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- testing.Bによるベンチマークの作成
- pprofによるCPUプロファイリング
- ヒープとメモリ割り当てのプロファイリング
- 実行トレース