0Pricing
Go Academy · レッスン

ヒープとメモリ割り当てのプロファイリング

ヒーププロファイルでメモリ使用の集中箇所を見つけます。

「ヒープとメモリ割り当てのプロファイリング」は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/heap

go 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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. testing.Bによるベンチマークの作成
  2. pprofによるCPUプロファイリング
  3. ヒープとメモリ割り当てのプロファイリング
  4. 実行トレース
← Go Academyに戻る