Golang

GC 三色标记 https://zhuanlan.zhihu.com/p/334999060

内存管理

  • 小对象:小于32KB
    Tiny对象:1Byte 至 16 Byte 且不包含指针
    其他对象:16Byte 至 32KB
  • 大对象:大于等于32KB

中心

  • mcache mcentral mheap

流程

  • 计算对象所需内存大小size
  • 根据size到size class映射,计算出所需的size class
  • 根据size class和对象是否包含指针计算出span class
  • 获取该span class指向的span

mcache 中span class

  • 包含指针对象
  • 不包含指针对象的

mcentral span class

  • nonempty:这个链表里的span,所有span都至少有1个空闲的对象空间。这些span是mcache释放span时加入到该链表的。
  • empty:这个链表里的span,所有的span都不确定里面是否有空闲的对象空间。当一个span交给mcache的时候,就会加入到empty链表。

mheap的span管理

mheap里保存了两棵二叉排序树,按span的page数量进行排序:

  • free:free中保存的span是空闲并且非垃圾回收的span。
  • scav:scav中保存的是空闲并且已经垃圾回收的span。