假设我有一个简单的映射,将字符串作为键类型,将自定义结构作为值类型。像这样:map[string]*struct我用许多不同的值填充这张地图,并且在一段时间后,这些值中的许多将永远不会再次使用。所以我不确定 golang 垃圾收集器是否会为我清理我的地图,或者我需要自己做。这使它看起来垃圾收集器不会为我做,我唯一的解决方案是如果我想不时释放一些内存,将我的地图设置为 nil。这是真的?或者有没有另一种方法可以在不丢失我的地图中非“非活动”值的情况下做到这一点?
2 回答
杨__羊羊
TA贡献1943条经验 获得超7个赞
为了尝试完全回答这个问题,我们需要弄清楚问题到底是什么。
对于标题问题:
我是否需要将地图设置为零才能对其进行垃圾收集?
不,一旦地图值超出范围,它将像任何其他值一样被垃圾收集。
我
map[string]*stuct
用许多不同的值填充这个 [ ] 映射,并且在一段时间后,这些值中的许多将永远不会再次使用。
您展示的这个示例地图包含指针值,只要它们包含在地图中,就永远不会收集它们指向的值。从映射中删除值(使用delete
或将键设置为另一个值)将允许收集指针引用的内存。不需要对地图进行特殊处理以确保垃圾收集。
现在,map 的内部结构目前没有被压缩,小值(包括指针和 128 字节以下的任何东西)直接存储在哈希桶中。包含数百万个条目的地图在删除这些条目后不会立即变小,因此如果您需要释放该内存,最好将您想要的剩余值复制到新地图中。这类似于拥有一个不再需要的大切片,除了一些值,您需要将剩余的值复制到新切片以释放原始支持数组。
DIEA
TA贡献1820条经验 获得超2个赞
您可以delete()
从地图中单独输入条目,即使是在对其进行迭代时也是如此。如果条目的值无法从其他任何东西访问(并且它足够大),它们将被 GC 处理。
您看的问题引用了一些旧代码(您可以自己查看源代码),从地图中删除对象后应该清空内存
- 2 回答
- 0 关注
- 150 浏览
添加回答
举报
0/150
提交
取消