Golang のマップ メモリを解放する方法: まずマップ内のすべてのキーを削除しますが、マップが占有しているメモリはまだ [使用状態] のままです。その後、マップは nil に設定され、マップが占有しているメモリはin [アイドル状態]; 最終的にアイドル状態になります メモリは、オペレーティング システムに再度適用することなく、一定期間内であれば次のアプリケーションで再利用できます。
Golang のマップ メモリを解放する方法:
サンプル コード:
go バージョン: 1.12.9
package main import ( "log" "runtime" ) var intMap map[int]int var cnt = 8192 func main() { printMemStats() initMap() runtime.GC() printMemStats() log.Println(len(intMap)) for i := 0; i < cnt; i++ { delete(intMap, i) } log.Println(len(intMap)) runtime.GC() printMemStats() intMap = nil runtime.GC() printMemStats() } func initMap() { intMap = make(map[int]int, cnt) for i := 0; i < cnt; i++ { intMap[i] = i } } func printMemStats() { var m runtime.MemStats runtime.ReadMemStats(&m) log.Printf("Alloc = %v TotalAlloc = %v Sys = %v NumGC = %v\n", m.Alloc/1024, m.TotalAlloc/1024, m.Sys/1024, m.NumGC) }
出力結果:
2019/11/22 15:42:33 Alloc = 138 TotalAlloc = 138 Sys = 68290 NumGC = 0 2019/11/22 15:42:33 Alloc = 456 TotalAlloc = 460 Sys = 68610 NumGC = 1 2019/11/22 15:42:33 8192 2019/11/22 15:42:33 0 2019/11/22 15:42:33 Alloc = 458 TotalAlloc = 464 Sys = 68674 NumGC = 2 2019/11/22 15:42:33 Alloc = 146 TotalAlloc = 466 Sys = 68674 NumGC = 3
フィールドの説明:
Alloc
: 現在のヒープ上でオブジェクトが占有しているメモリ サイズ;
TotalAlloc
: ヒープに割り当てられた合計メモリ サイズ;
#Sys
: プログラムは、システムによって要求された合計メモリ サイズに基づいて動作します;
NumGC
: ガベージ コレクションの実行数。
#実行結果から、マップ内のキーが削除された後に占有されていたメモリが解放されていないことがわかります。
結論:
Golang のマップはキーが削除された直後にメモリを解放しないため、プログラムが実行されるにつれて、マップによって占有されるメモリは実際には増加するだけです。 。さらに、GC はマーキング フェーズ中にマップ内のすべての要素にアクセスするため、マップが非常に大きい場合、プログラムのパフォーマンスに非常に大きなオーバーヘッドが生じます。ただし、go バージョン 1.5 以降では、マップのキーと値にポインターが含まれていない場合、GC はマップを無視します。
関連する学習に関する推奨事項: Go 言語チュートリアル
以上がgolangでマップメモリを解放するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。