golang釋放map記憶體的方法:先刪除map中的所有key,map佔用記憶體仍處於【使用狀態】;然後map置為nil,map佔用的記憶體處於【空閒狀態】;最後處於空閒狀態內存,在一定時間內下次申請的可重複使用,不必再向操作系統申請即可。
golang釋放map記憶體的方法:
範例程式碼:
go version: 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的map在key被刪除之後,並不會立即釋放內存,所以隨著程式的運行,實際上map佔用的記憶體只會越來越大。此外,GC會在標記階段存取map中的每一個元素,當map非常大時這會對程式效能帶來非常大的開銷。不過go 1.5版本之後,如果map的key和value中都不包含指針,那麼GC就會忽略這個map。
相關學習推薦:
以上是golang如何釋放map記憶體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!