golang我想删除一个map的key的时候, 只是做了个标记, 底层内存不会真正的释放, 这样可能会导致内存一直增长下去造成问题
请问有什么办法可以解决map删除某个key的时候, 底层内存也清楚了嘛
golang我想删除一个map的key的时候, 只是做了个标记, 底层内存不会真正的释放, 这样可能会导致内存一直增长下去造成问题
请问有什么办法可以解决map删除某个key的时候, 底层内存也清楚了嘛
7 回答4.6k 阅读
6 回答6.5k 阅读✓ 已解决
1 回答5.8k 阅读✓ 已解决
2 回答3.5k 阅读✓ 已解决
1 回答5.4k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
4 回答1.7k 阅读
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
不起作用。