gc in golang
TRANSCRIPT
![Page 1: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/1.jpg)
GC golang
![Page 2: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/2.jpg)
Tri-color garbage collection
•
•
• garbage
![Page 3: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/3.jpg)
Tri-color garbage collection• root scan: root ( )
push stack
• mark phase:
• stack
• stack
•
• stack ( root root )
• sweep phase heap
![Page 4: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/4.jpg)
Tri-color garbage collection
• mark phase & sweep phase mutator pause time
![Page 5: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/5.jpg)
Tri-color gc
![Page 6: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/6.jpg)
![Page 7: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/7.jpg)
• A F push stack
root scan
![Page 8: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/8.jpg)
• stack A F push stack
mark
![Page 9: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/9.jpg)
• B C D stack
mark
![Page 10: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/10.jpg)
•
sweep
![Page 11: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/11.jpg)
mark
![Page 12: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/12.jpg)
• mark A J
write barrier
![Page 13: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/13.jpg)
• A I
write barrier
![Page 14: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/14.jpg)
• sweep
write barrier
![Page 15: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/15.jpg)
write barrier
• push stack
![Page 16: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/16.jpg)
sweep
![Page 17: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/17.jpg)
• < current sweep > current sweep
![Page 18: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/18.jpg)
GOGC
![Page 19: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/19.jpg)
GOGC
• GOGC golfing GC
• GOGC=100 heap 100% GC GC = 200 200%
![Page 20: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/20.jpg)
![Page 21: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/21.jpg)
tradeoff• tricolor GC pause time
• heap size sweep
• throughput CPU GC
• Spatial Locality
![Page 22: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/22.jpg)
GC example code
![Page 23: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/23.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/24.jpg)
gctrace output
• CPU 32% GC
• GC pause time 0.18 + 0.98
ms
• heap size 625M
![Page 25: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/25.jpg)
• htop 1313M
htop
![Page 26: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/26.jpg)
slice List
![Page 27: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/27.jpg)
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](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/28.jpg)
gctrace output
• CPU 5% GC
• GC pause time 1.1 + 2.1 ms
• heap size 156M
![Page 29: Gc in golang](https://reader031.vdocuments.us/reader031/viewer/2022021416/58e4a1291a28abf5428b6241/html5/thumbnails/29.jpg)
Real Memory size
• htop 188M