【发布时间】:2016-08-13 08:47:45
【问题描述】:
假设我有一个简单的映射,其中字符串作为键类型,自定义结构作为值类型。像这样:map[string]*struct
我用很多不同的值填充这张地图,并且这些值中的很多在一段时间后将永远不会再次使用。
所以我不确定 golang 垃圾收集器是否会为我清理我的地图,或者我需要自己清理。然后我在另一个问题上遇到了这个答案:Is it safe to remove selected keys from Golang map within a range loop?
这使得垃圾收集器看起来不会为我做这件事,我唯一的解决方案是如果我想不时释放一些内存,我的地图设置为 nil。
这是真的吗?还是有另一种方法可以做到这一点而不会丢失我的地图中非“非活动”的值?
【问题讨论】:
-
GC 收集所有无法访问的内存。地图和地图中删除的值都会被收集。地图结构可能会或可能不会被压缩,但这与正在收集的值是分开的。
-
我不确定你在问什么。垃圾收集器不会删除地图中的条目,因为它们被地图引用(假设地图本身是可访问的)。如果地图中有不再需要的条目,则应将其删除。如果您将映射中特定键的值设置为 nil,则该映射条目指向的结构将被垃圾收集,假设它无法以其他方式访问。
-
那么,verran 关于在stackoverflow.com/questions/36747776/… 中删除不释放内存的建议是不正确的?
-
@siebertschoutteten 你刚刚链接回这个问题。
-
我想你指的是stackoverflow.com/a/23231539/152948——答案是肯定的和否定的。 bucket 永远不会被清理。如果映射存储了一个值类型(如
int),则该int的存储在存储桶内,因此除非您将映射归零,否则它也永远不会被清理。但是,如果地图正在存储指针,那么这意味着 指针的存储 将持续存在,但如果没有指向它,则指向的值将被 GC 处理。
标签: memory-management go garbage-collection