29
GC ᄍᓒဩ፡纷ୗ承 golang

Gc in golang

Embed Size (px)

Citation preview

Page 1: Gc in golang

GC golang

Page 2: Gc in golang

Tri-color garbage collection

• garbage

Page 3: Gc in golang

Tri-color garbage collection• root scan: root ( )

push stack

• mark phase:

• stack

• stack

• stack ( root root )

• sweep phase heap

Page 4: Gc in golang

Tri-color garbage collection

• mark phase & sweep phase mutator pause time

Page 5: Gc in golang

Tri-color gc

Page 6: Gc in golang
Page 7: Gc in golang

• A F push stack

root scan

Page 8: Gc in golang

• stack A F push stack

mark

Page 9: Gc in golang

• B C D stack

mark

Page 10: Gc in golang

sweep

Page 11: Gc in golang

mark

Page 12: Gc in golang

• mark A J

write barrier

Page 13: Gc in golang

• A I

write barrier

Page 14: Gc in golang

• sweep

write barrier

Page 15: Gc in golang

write barrier

• push stack

Page 16: Gc in golang

sweep

Page 17: Gc in golang

• < current sweep > current sweep

Page 18: Gc in golang

GOGC

Page 19: Gc in golang

GOGC

• GOGC golfing GC

• GOGC=100 heap 100% GC GC = 200 200%

Page 20: Gc in golang
Page 21: Gc in golang

tradeoff• tricolor GC pause time

• heap size sweep

• throughput CPU GC

• Spatial Locality

Page 22: Gc in golang

GC example code

Page 23: Gc in golang

test codepackage main import ( "container/list" "time" ) func GenList() { l := list.New() for i := 0; i < 10000; i++ { str := "aaaaaaaaaaaaaaaaaaa" l.PushBack(str) } } func main() { count := 0 for { count++ for i := 0; i < 1000; i++ { go func() { GenList() }() } time.Sleep(500 * time.Millisecond) if count == 360 { time.Sleep(10000 * time.Millisecond) count =0 } } }

Page 24: Gc in golang

gctrace output

• CPU 32% GC

• GC pause time 0.18 + 0.98

ms

• heap size 625M

Page 25: Gc in golang

• htop 1313M

htop

Page 26: Gc in golang

slice List

Page 27: Gc in golang

test codepackage main import ( "time" ) func GenSlice() { s:= make([]string, 10000) for i:= 0;i<10000;i++ { str := "aaaaaaaaaaaaaaaaaaa" s[i] = str } } func main() { count := 0 for { count++ for i := 0; i < 1000; i++ { go func() { GenSlice() }() } time.Sleep(500 * time.Millisecond) if count == 360 { time.Sleep(10000 * time.Millisecond) count =0 } } }

Page 28: Gc in golang

gctrace output

• CPU 5% GC

• GC pause time 1.1 + 2.1 ms

• heap size 156M

Page 29: Gc in golang

Real Memory size

• htop 188M