Dear Gophers:I have some questions about GC and map[int]int, please help.consider the following program:```gopackage mainimport ("fmt""os""runtime/pprof")func main() {f, err := os.OpenFile("memory.pb.gz", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)if err != nil {panic(err)}m := make(map[int]int)for i := 0; i < 10e6; i++ {m[i] = 2 * i}if err := pprof.WriteHeapProfile(f); err != nil {panic(err)}}```after inserting 10 million key/value pair, the result of this memory profile show inuse_objects count ~ 100k```bashgo tool pprof -inuse_objects memory.pb.gz
Type: inuse_objects
Time: Nov 23, 2023 at 3:40pm (CST)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) top
Showing nodes accounting for 127450, 100% of 127450 total
flat flat% sum% cum cum%
127450 100% 100% 127450 100% main.main
```in my view this inuse_objects is found by GC by following the bucket and old_buckets pointer of hmap```go// A header for a Go map.type hmap struct {// Note: the format of the hmap is also encoded in cmd/compile/internal/reflectdata/reflect.go.// Make sure this stays in sync with the compiler's definition.count int // # live cells == size of map. Must be first (used by len() builtin)flags uint8B uint8 // log_2 of # of buckets (can hold up to loadFactor * 2^B items)noverflow uint16 // approximate number of overflow buckets; see incrnoverflow for detailshash0 uint32 // hash seedbuckets unsafe.Pointer // array of 2^B Buckets. may be nil if count==0.oldbuckets unsafe.Pointer // previous bucket array of half the size, non-nil only when growingnevacuate uintptr // progress counter for evacuation (buckets less than this have been evacuated)extra *mapextra // optional fields}```but according to this doc: https://go101.org/optimizations/6-map.htmlIf the key type and element type of a map both don't contain pointers, then in the scan phase of a GC cycle, the garbage collector will not scan the entries of the map. This could save much time.
My question is:maybe GC should not follow the bucket and old_buckets pointer of hmap?or the doc above just forbid GC from scan the entries not the bucket and old_buckets pointer of hmap, and larger map[int]int do increase GC scan overhead by having more buckets and old_buckets?Thanks--
You received this message because you are subscribed to the Google Groups "golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/b7049ce2-d5a8-49bc-ae44-7a73777494f4n%40googlegroups.com.
If the key type and element type of a map both don't contain pointers, then in the scan phase of a GC cycle, the garbage collector will not scan the entries of the map. This could save much time.