sync.map是什么?
请参照博客:Go1.9 sync.Map揭秘
go的原生map删除元素,内存会自动释放吗?
请参照博客:Go的原生map中删除元素,内存会自动释放吗?
先说结论:
-
如果删除的元素是值类型,如int,float,bool,string以及数组和struct,map的内存不会自动释放
-
如果删除的元素是引用类型,如指针,slice,map,chan等,map的内存会自动释放,但释放的内存是子元素应用类型的内存占用
map和sync.map两者区别:
乍一看除了sync.map不能为nil之外,两者没什么区别。但其实不然
具体可见如下的实验
小知识:sync.map开箱即用,不能赋值为nil
初始值为:sync.Map{mu:sync.Mutex{state:0, sema:0x0}, read:atomic.Value{v:interface {}(nil)}, dirty:map[interface {}]*sync.entry(nil), misses:0}
重要一点:
申请一个全局map来保证内存被分配到堆上面
实验1
普通的sync.map,保存的是int到int的映射,会执行delete删除每一项,执行垃圾回收,看内存是否被回收,
package main
import (
"fmt"
"log"
"runtime"
"sync"
)
var lastTotalFreed uint64
var intMap sync.Map
var cnt = 80920
func main() {
printMemStats()
initMap()
runtime.GC()
printMemStats()
fmt.Printf("%#v", intMap)
fmt.Println()
for i := 0; i < cnt; i++ {
intMap.Delete(i)
}
fmt.Printf("%#v", intMap)
fmt.Println()
runtime.