您好,登錄后才能下訂單哦!
怎么在golang中釋放map內存?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
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
: 垃圾回收運行的次數。
從運行結果可以看出,map中的key被刪除以后占用的內存并沒有被釋放掉。
結論:
golang的map在key被刪除之后,并不會立即釋放內存,所以隨著程序的運行,實際上map占用的內存只會越來越大。此外,GC會在標記階段訪問map中的每一個元素,當map非常大時這會對程序性能帶來非常大的開銷。不過go 1.5版本之后,如果map的key和value中都不包含指針,那么GC會忽略這個map。
看完上述內容,你們掌握怎么在golang中釋放map內存的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。