假设我有一个简单的映射,其中string作为keytype,一个自定义的struct作为valuetype。像这样:map[string]*struct
我用很多不同的值填充这个地图,并且在一段时间后,这些值中的很多将不再被使用。
所以我不确定果朗垃圾收集者是否会帮我清理地图,或者我需要自己动手。然后我在另一个问题上找到了这个答案:Is it safe to remove selected keys from Golang map within a range loop?
这使得垃圾收集器看起来不会为我做这件事,我唯一的解决方案是,如果我想时不时地释放一些内存,就将我的映射设置为nil。
这是真的吗?或者有没有其他方法可以在不丢失映射中非“非活动”值的情况下执行此操作?

最佳答案

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

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

10-10 18:19