网易首页 > 网易号 > 正文 申请入驻

听说过对 Go map 做 GC 吗?

0
分享至

在 Golang 中的 map 结构,在删除键值对的时候,并不会真正的删除,而是标记。那么随着键值对越来越多,会不会造成大量内存浪费?

首先答案是会的,很有可能导致 OOM,而且针对这个还有一个讨论:https://github.com/golang/go/issues/20135。大致的意思就是在很大的map中,delete操作没有真正释放内存而可能导致内存 OOM。

所以一般的做法:就是 重建map。而go-zero中内置了safemap的容器组件。safemap在一定程度上可以避免这种情况发生。

那首先我们看看go原生提供的map是怎么删除的?

原生map删除

1 package main
2
3 func main() {
4 m := make( map[ int] string, 9)
5 m[ 1] = "hello"
6 m[ 2] = "world"
7 m[ 3] = "go"
8
9 v, ok := m[ 1]
10 _, _ = fn(v, ok)
11
12 delete(m, 1)
13 }
14
15 func fn(v string, ok bool) (string, bool) {
16 return v, ok
17 }

测试代码如上,我们可以通过go tool compile -S -N -l testmap.go | grep "CALL"

0x0071 00113 (test/testmap.go:4) CALL runtime.makemap(SB)
0x0099 00153 (test/testmap.go:5) CALL runtime.mapassign_fast64(SB)
0x00ea 00234 (test/testmap.go:6) CALL runtime.mapassign_fast64(SB)
0x013b 00315 (test/testmap.go:7) CALL runtime.mapassign_fast64(SB)
0x0194 00404 (test/testmap.go:9) CALL runtime.mapaccess2_fast64(SB)
0x01f1 00497 (test/testmap.go:10) CALL "".fn(SB)
0x0214 00532 (test/testmap.go:12) CALL runtime.mapdelete_fast64(SB)
0x0230 00560 (test/testmap.go:7) CALL runtime.gcWriteBarrier(SB)
0x0241 00577 (test/testmap.go:6) CALL runtime.gcWriteBarrier(SB)
0x0252 00594 (test/testmap.go:5) CALL runtime.gcWriteBarrier(SB)
0x025c 00604 (test/testmap.go:3) CALL runtime.morestack_noctxt(SB)

执行第12行的delete,实际执行的是runtime.mapdelete_fast64

这些函数的参数类型是具体的int64mapdelete_fast64跟原始的delete操作一样的,所以我们来看看mapdelete

mapdelete

长图预警!!!

大致代码分析如上,具体代码就留给大家去阅读了。其实大致过程:

  1. 写保护,防止并发写

  2. 查询要删除的key是否存在

  3. 存在则对其标志做删除标记

  4. count--

所以你在大面积删除key,实际map存储的key是不会删除的,只是标记当前的key状态为empty

其实出发点,和mysql的标记删除类似,防止后续会有相同的key插入,省去了扩缩容的操作。

但是这个对有些场景是不妥的,如果开发者在未来时间内都不会再插入相同的key,很可能会导致OOM

所以针对以上情况,go-zero开发了safemap。下面我们看看safemap是如何避免这个问题的?

safemap

直接从操作safemap中分析为什么要这么设计:

  1. 预设一个 删除阈值,如果触发会放到一个新预设好的newmap

  2. 两个map是一个整体,所以key只能留一份

所以为什么要设置两个map就很清楚了:

  1. dirtyOld作为存储主体,如果delete操作达到阈值,则会触发迁移。

  2. dirtyNew作为暂存体,会在到达阈值时,存放部分key/value

所以在迁移操作时,我们需要做的就是:将原先的dirtyOld清空,存储的 key/value 通过 for-range 重新存储到dirtyNew,然后将dirtyNew指向dirtyOld

> 可能会有疑问:不是说key/value没有删除吗,只是标记了tophash=empty> > 其实在for-range过程中,会过滤掉tophash <= emptyOne的 key

这样就实现了不需要的 key 不会被加入到dirtyNew,进而不会影响dirtyOld

这其实也就是垃圾回收的年老代和新生代的概念。

更多实现细节,可以查看源码!

项目地址

https://github.com/tal-tech/go-zero

https://gitee.com/kevwan/go-zero

欢迎使用 go-zero 并 star 支持我们!

END

如何有效表白

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
仅续约2主力,成都蓉城果断清洗9将 要马镇当替补 董岩锋重回大连

仅续约2主力,成都蓉城果断清洗9将 要马镇当替补 董岩锋重回大连

替补席看球
2024-12-02 12:08:07
为什么现在没人穿中山装了?其实原因很简单!

为什么现在没人穿中山装了?其实原因很简单!

星辰故事屋
2024-11-26 11:54:41
AI眼镜第一龙头,社保基金大举买入,订单拿到手软,有望大涨180%

AI眼镜第一龙头,社保基金大举买入,订单拿到手软,有望大涨180%

吴僼旅行ing
2024-12-02 06:00:02
44岁冯绍峰梅开二度,新女友正脸曝光,大眼圆脸菀菀类卿,烟瘾大

44岁冯绍峰梅开二度,新女友正脸曝光,大眼圆脸菀菀类卿,烟瘾大

娱乐的小灶
2024-12-02 14:41:53
海南屯昌5名男子深夜盗窃公庙财物被抓获

海南屯昌5名男子深夜盗窃公庙财物被抓获

北青网-北京青年报
2024-12-02 16:04:06
火箭险胜雷霆!伊森阿门申京疯狂庆祝,狄龙淡定,范乔丹泼水庆祝

火箭险胜雷霆!伊森阿门申京疯狂庆祝,狄龙淡定,范乔丹泼水庆祝

篮球资讯达人
2024-12-02 11:04:10
《再见爱人》嘉宾李行亮多个演出遭网友抵制!团队:现在不方便回应

《再见爱人》嘉宾李行亮多个演出遭网友抵制!团队:现在不方便回应

极目新闻
2024-12-02 08:51:24
重磅官宣!涉及广州多区!12个旧改集中动工!

重磅官宣!涉及广州多区!12个旧改集中动工!

房地产导刊
2024-12-02 10:21:05
洲际导弹攻入基辅,12枚弹头斩首,11名统帅殒命,损失500警卫

洲际导弹攻入基辅,12枚弹头斩首,11名统帅殒命,损失500警卫

听风者说
2024-11-29 21:00:49
正式回归,陈梦粉衣亮相,官宣决定,马琳批准,孙颖莎祝福

正式回归,陈梦粉衣亮相,官宣决定,马琳批准,孙颖莎祝福

东球弟
2024-12-02 08:55:50
1970年毛林初次交锋,林彪一伙在庐山突然发难,毛泽东严重不满

1970年毛林初次交锋,林彪一伙在庐山突然发难,毛泽东严重不满

拙言问史
2024-07-27 00:43:54
八路军成立后,任职名单交到毛主席手里,他怒道:欺负老实人!

八路军成立后,任职名单交到毛主席手里,他怒道:欺负老实人!

洞鉴五千年
2024-11-29 12:03:35
伟大的10-8!特鲁姆普13年后再夺冠,解锁3大纪录,张安达受益!

伟大的10-8!特鲁姆普13年后再夺冠,解锁3大纪录,张安达受益!

刘姚尧的文字城堡
2024-12-02 06:44:18
一巴掌全呼脸上了!哈登把小波特打“哭”了

一巴掌全呼脸上了!哈登把小波特打“哭”了

直播吧
2024-12-02 13:15:20
刘亦菲竟然也有处于下风的时候!在这张合照里,她甚至不如舒淇!

刘亦菲竟然也有处于下风的时候!在这张合照里,她甚至不如舒淇!

人情皆文史
2024-11-18 02:51:33
中国渔船围岛? 菲完全不怕,新加坡专家:很快就知道中国想干啥了

中国渔船围岛? 菲完全不怕,新加坡专家:很快就知道中国想干啥了

千里持剑
2024-11-29 14:27:08
刚官降就“一夜成名”!官补4.5万,续航1289KM,喝92油还看啥问界M7

刚官降就“一夜成名”!官补4.5万,续航1289KM,喝92油还看啥问界M7

华哥视界
2024-12-02 09:03:07
华为Mate70Pro+发布就降价,花粉兴奋的炸了

华为Mate70Pro+发布就降价,花粉兴奋的炸了

3C毒物
2024-12-02 07:33:05
张智霖袁咏仪是懂藏拙的,平时发自拍就像60岁,上了综艺就像30岁

张智霖袁咏仪是懂藏拙的,平时发自拍就像60岁,上了综艺就像30岁

洲洲影视娱评
2024-11-15 22:05:36
重庆市第九人民医院党委书记阳光接受审查调查

重庆市第九人民医院党委书记阳光接受审查调查

界面新闻
2024-12-02 15:32:33
2024-12-02 16:47:00
开源中国
开源中国
每天为开发者推送最新技术资讯
6625文章数 34301关注度
往期回顾 全部

科技要闻

ChatGPT发布两周年,OpenAI“官司缠身”

头条要闻

中方再回应"立陶宛要求中国外交人员离境": 粗暴挑衅

头条要闻

中方再回应"立陶宛要求中国外交人员离境": 粗暴挑衅

体育要闻

什么?滕哈格还在曼彻斯特?

娱乐要闻

这是麦琳?烟熏妆神似安室奈美惠!

财经要闻

刘世锦:扩大消费需求要找准重点或痛点

汽车要闻

小米汽车:11月交付继续超2万辆 全年冲刺13万辆

态度原创

教育
健康
亲子
数码
艺术

教育要闻

考研后身价“倍增”的四大专业,毕业拿高薪!

花18万治疗阿尔茨海默病,值不值?

亲子要闻

妈妈晒自家宝宝悄悄吐泡泡,被妈妈发现后收回去

数码要闻

当贝服务:匠心守护,科技温情无 “界”

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

无障碍浏览 进入关怀版