我是否需要将地图设置为零才能对其进行垃圾收集?

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

我用许多不同的值填充这张地图,并且在一段时间后,这些值中的许多将永远不会再次使用。

所以我不确定 golang 垃圾收集器是否会为我清理我的地图,或者我需要自己做。

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

这是真的?或者有没有另一种方法可以在不丢失我的地图中非“非活动”值的情况下做到这一点?


慕森卡
浏览 151回答 2
2回答

杨__羊羊

为了尝试完全回答这个问题,我们需要弄清楚问题到底是什么。对于标题问题:我是否需要将地图设置为零才能对其进行垃圾收集?不,一旦地图值超出范围,它将像任何其他值一样被垃圾收集。我map[string]*stuct用许多不同的值填充这个 [ ] 映射,并且在一段时间后,这些值中的许多将永远不会再次使用。您展示的这个示例地图包含指针值,只要它们包含在地图中,就永远不会收集它们指向的值。从映射中删除值(使用delete或将键设置为另一个值)将允许收集指针引用的内存。不需要对地图进行特殊处理以确保垃圾收集。现在,map 的内部结构目前没有被压缩,小值(包括指针和 128 字节以下的任何东西)直接存储在哈希桶中。包含数百万个条目的地图在删除这些条目后不会立即变小,因此如果您需要释放该内存,最好将您想要的剩余值复制到新地图中。这类似于拥有一个不再需要的大切片,除了一些值,您需要将剩余的值复制到新切片以释放原始支持数组。

DIEA

您可以delete()从地图中单独输入条目,即使是在对其进行迭代时也是如此。如果条目的值无法从其他任何东西访问(并且它足够大),它们将被 GC 处理。您看的问题引用了一些旧代码(您可以自己查看源代码),从地图中删除对象后应该清空内存
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go