Golang's method of releasing map memory: first delete all keys in the map, and the memory occupied by the map is still in [used state]; then map is set to nil, and the memory occupied by map is in [idle state]; finally it is idle State memory can be reused in the next application within a certain period of time without having to apply to the operating system again.
Golang’s method of releasing map memory:
Sample code:
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) }
Output result:
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
Field description:
Alloc
: The memory size occupied by the object on the current heap;
TotalAlloc
: The total memory size allocated on the heap;
#Sys
: The program operates from The total memory size requested by the system;
NumGC
: The number of garbage collection runs.
#It can be seen from the running results that the memory occupied after the key in the map is deleted has not been released.
Conclusion:
Golang’s map will not release the memory immediately after the key is deleted, so as the program runs, the memory occupied by the map will actually only increase. The bigger. In addition, GC will access every element in the map during the marking phase, which will bring a very large overhead to program performance when the map is very large. However, after go version 1.5, if the key and value of the map do not contain pointers, the GC will ignore the map.
Related learning recommendations: Go language tutorial
The above is the detailed content of How to release map memory in golang?. For more information, please follow other related articles on the PHP Chinese website!