goalng map delete操作不会释放底层内存
golang我想删除一个map的key的时候, 只是做了个标记, 底层内存不会真正的释放, 这样可能会导致内存一直增长下去造成问题
请问有什么办法可以解决map删除某个key的时候, 底层内存也清楚了嘛
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
golang我想删除一个map的key的时候, 只是做了个标记, 底层内存不会真正的释放, 这样可能会导致内存一直增长下去造成问题
请问有什么办法可以解决map删除某个key的时候, 底层内存也清楚了嘛
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
go version go1.13.1 darwin/amd64
尝试做一次实验:
输出:
针对:底层内存不会真正的释放, 这样可能会导致内存一直增长下去造成问题。
可以看到,新版本的 Golang 难道真的会回收 map 的多余空间哦,难道哈希表会随着 map 里面的元素变少,然后缩小了?
我又尝试了一下,将 map 放在外层:
输出:
这时 map 好像内存没变化,直到设置为 nil。
为什么全局变量就会不变呢?
而为什么,局部变量还在使用着,它里面还剩一个元素,为什么就会缩小呢,大家都是 map,空间会一直增长,局部变量有优先权变小?难道 Golang 底层做了一些特殊处理?
于是我又做了一次操作,将局部变量添加一万个数,然后再删除9999个数,再添加9999个,看其变化:
输出:
这次局部变量删除后,和全局变量map一样了,内存耶没变化。
但是添加10000个数后内存反而变小了。
这神奇的 Golang 啊。
map删除元素后map内存是不会释放的,无论是局部还是全局,但引出了上面一个奇怪的问题。
https://github.com/golang/go/...
为什么添加10000个数后内存反而变小了?因为 Golang 编译器有提前优化功能,它知道后面
map a
已经不会被使用了,所以会垃圾回收掉,a = nil
不起作用。这或许能帮到你
https://github.com/golang/go/...
map就相当于用几组固定长度数组组成的,只会删一整组,不会单个删了就删那一块的内存
删除之后会进行装载因子的计算,大于6.5就扩容,小于就删桶