go语言内存管理详解2 | 青训营笔记

58 阅读1分钟

02 Go内存管理及优化

2.1Go内存分配

2.1.1 - 分块

目标:为对象在heao上分配内存

提前将内存分块:

  • 调用系统调用mmap()向OS申请一大块内存,如4MB
  • 现将内存划分成大块,例如8KB,称作mspan
  • 再讲大块继续划分成特定大小的小块,用于对象分配
  • noscan mspan:分配不包含指针的对象 -- GC不需要扫描
  • scan mspan:分配包含指针的对象 -- GC需要扫描

对象分配:根据对象的大小,分配最合适的内存返回

image-20230131162352666.png

2.1.2 - 缓存

TCMalloc:thread caching

image-20230131162735530.png

image-20230131162751188.png

2.2Go内存管理优化

image-20230131163039309.png

2.3字节跳动优化方案 - Balanced GC

image-20230131163638008.png

image-20230131163648619.png

image-20230131163706790.png

image-20230131163827773.png

image-20230131163847604.png 图中黑色部分的对象存活,整个GAB都不能被释放

解决方案:移动GAB中存活的对象

  • 当GAB总大小超过一定阈值时,将GAB中存活的对象复制到另外分配的GAB中

  • 原先的GAB可以释放,避免内存泄漏

  • 本质:用copying GC 的算法管理小对象

    根据对象的生命周期,使用不同的标记和清理策略

image-20230131164217353.png

image-20230131164356168.png

2.4 总结

image-20230131164501273.png