我是否需要将地图设置为nil才能进行垃圾回收?

sie*_*rts 4 garbage-collection memory-management go

假设我有一个简单的映射,字符串为keytype,自定义结构为valuetype.像这样:map[string]*struct

我用很多不同的值填充这个地图,很多这些值在一段时间后永远不会再使用.

所以我不确定golang垃圾收集器是否会为我清理我的地图,或者我需要自己做.然后我在另一个问题上遇到了这个答案:在范围循环中从Golang地图中删除选定的键是否安全?

这使得它看起来像垃圾收集器不会为我做,我唯一的解决方案是将我的地图设置为nil,如果我想时不时释放一些内存.

这是真的?或者还有另一种方法可以做到这一点而不会丢失地图中不是"非活动"的值吗?

Jim*_*imB 5

为了尝试完全回答这个问题,我们需要弄清楚问题究竟是什么.

对于标题问题:

我是否需要将地图设置为nil才能进行垃圾回收?

不,一旦地图值超出范围,它将像任何其他值一样被垃圾收集.

map[string]*stuct使用许多不同的值填充此[ ]地图,并且在一段时间后将永远不会再使用这些值.

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

现在,地图的内部结构当前没有被压缩,并且小​​值(包括指针,以及128字节以下的任何内容)直接存储在散列桶中.删除这些条目后,包含数百万条目的地图不会立即变小,因此如果您需要释放该内存,最好将所需的剩余值复制到新地图中.这类似于除了一些值之外不再需要的大片,您需要将剩余的值复制到新的片以释放原始的后备阵列.