memory-management - 我是否需要将 map 设置为 nil 才能对其进行垃圾回收?

标签 memory-management go garbage-collection

假设我有一个简单的映射,其中字符串作为键类型,自定义结构作为值类型。像这样:map[string]*struct

我用很多不同的值填充这张 map ,其中很多值在一段时间后将永远不会再次使用。

所以我不确定 golang 垃圾收集器是否会为我清理我的 map ,或者我需要自己做。然后我在另一个问题上遇到了这个答案:Is it safe to remove selected keys from Golang map within a range loop?

这让垃圾收集器看起来不会为我做这件事,如果我想不时释放一些内存,我唯一的解决方案是将我的映射设置为 nil。

这是真的吗?还是有另一种方法可以做到这一点而不会丢失我的 map 中不是“不活动”的值?

最佳答案

要尝试完整地回答这个问题,我们需要弄清楚问题到底是什么。

对于题目问题:

Do I need to set a map to nil in order for it to be garbage collected?

不,一旦映射值超出范围,它将像任何其他值一样被垃圾回收。

I populate this [map[string]*stuct] map with a lot of different values and a lot of these values will never be used again after a certain period of time.

您显示的这个示例 map 包含指针值,只要它们包含在 map 中,就永远不会收集它们指向的值。从映射中删除值(使用 delete 或将键设置为另一个值)将允许收集指针引用的内存。不需要围绕 map 进行特殊处理以确保垃圾收集。

现在, map 的内部结构目前还没有被压缩,小值(包括指针,以及任何小于 128 字节的东西)直接存储在哈希桶中。具有数百万个条目的 map 在删除这些条目后不会立即变小,因此如果您需要释放该内存,最好将您想要的剩余值复制到新 map 。这类似于拥有一个大 slice ,除了几个值外不再需要,您需要将剩余的值复制到新 slice 以释放原始支持数组。

关于memory-management - 我是否需要将 map 设置为 nil 才能对其进行垃圾回收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36747776/

相关文章:

go - 如何在测试中期待JSON

go - Terratest 在错误断言上抛出错误

java - substring() 的垃圾友好替代品

php - 优化php和mysql的内存管理

multithreading - 即使使用 GOMAXPROCS(4),GoLang 程序也在单线程上执行

c++ - 可以在c++中动态和在编译时分配的最大内存

java - jvm gc大小可以自动增加吗?

java - OCJP考试垃圾回收

c++ - 结构的 cudaMalloc 和相同结构的元素

ios - 如何在iOS中将NSObject分配到其自己的虚拟内存页面上?