Go的sync.map删除元素,内存会自动释放吗?

本文探讨了Go的sync.map与原生map在删除元素后内存是否自动释放的问题。结论指出,删除值类型元素时内存不会自动释放,而删除引用类型元素时,仅释放子元素的内存。通过实验展示了sync.map在执行delete操作后,其dirty部分的内存被回收,而read部分保持不变。实验进一步包含了嵌套sync.map的情况。
摘要由CSDN通过智能技术生成

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.
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值