Home  >  Article  >  Backend Development  >  How to release map memory in golang?

How to release map memory in golang?

coldplay.xixi
coldplay.xixiOriginal
2020-07-18 15:03:0612040browse

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.

How to release map memory in golang?

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn