如何给Golang map做GC

这篇文章主要为大家展示了“如何给Golang map做GC”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何给Golang map做GC”这篇文章吧。

                           

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

mapdelete
go-zerosafemapsafemap
gomap

原生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)
deleteruntime.mapdelete_fast64
int64mapdelete_fast64deletemapdelete

mapdelete

长图预警!!!

如何给Golang map做GC

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

keycount--
keymapkeyempty
key
keyOOM
go-zerosafemapsafemap

safemap

safemap

如何给Golang map做GC

newmapmapkey
map
dirtyOlddeletedirtyNewkey/value
dirtyOlddirtyNewdirtyNewdirtyOld
key/valuetophash=emptyfor-rangetophash <= emptyOne
dirtyNewdirtyOld

如何给Golang map做GC

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

以上是“如何给Golang map做GC”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!