-
GC
-
V1.3之前标记清除法:先标记到不了的内存的再清除,整个过程都需要stw
-
V1.5三色并发标记法,启用写屏障,重复遍历,开始全标记白,每一次扫描能到的白变灰、能到的对象标记灰变黑,直到只剩下到不了的对象标记白,最后清除白对象。不需要每次都扫描整个内存空间,可以减少stw的时间
-
V1.8 混合写屏障,采用插入写屏障和删除写屏障,一次找出所有黑不重复扫描,期间栈上新建的对象为黑色,(依赖关系)被删除和堆上添加对象标记为灰。期间仅开启和关闭屏障各需要一次stw
- 不stw,两个问题会破坏回收
-
黑色对象引用白色对象—对应强三色不变性:黑色对象不会指向白色,只会指向黑或灰
-
灰色对象到白色对象的访问路径被破坏——对应弱三色不变性:黑色对象指向的白色对象必须受灰色保护
-
插入写屏障满足强三色不变性,不存在黑色对象引用白色对象的情况了, 因为白色会变成灰色,可以在堆上被触发,在无stw下可与go程序并行执行而不会破坏垃圾回收
-
删除写屏障满足弱三色不变性,断开处后面白色对象会变灰,保护灰色对象到白色对象的路径不会断,可以在堆上被触发,在无stw下可与go程序并行执行而不会破坏垃圾回收
-
混合写屏障满足弱三色不变性
-
- 不stw,两个问题会破坏回收
-
GC触发:手动触发调用runtime.GC阻塞式等待GC完成,被动触发每过两分钟或者内存使用增幅超一倍
-
-
内存管理
- span是内存管理基本单位,是一组连续的page。
- mcache保存各种大小的span并按spanclass分类,小对象从mcache直接分配,每个p对应一个mcache,可无锁所访问。
- mcentral是所有线程共享缓存需加锁访问,将spanclass分类并串成链表,每个类一条包含指针的链表,一条不包含指针的链表,mcache的span用光时向mcentral申请。
- mheap是堆内存的抽象,mcentral的span不够用会向mheap申请且需要加锁访问,mheap不够会向os申请。mheap把span组织成两棵树
- 内存分配分大、中、小、tiny对象分类,为(小于32kb)对象寻找span寻找span的流程如下:
- 计算对象所需内存大小size
- 根据size到size class映射,计算出所需的size class
- 根据size class和对象是否包含指针计算出span class
- 获取该span class指向的span
- 大于32kb在mheap上分配,优先在free搜索,没有则从scav搜索,若还没有则向os申请并从树搜索,若返回span较大,分割为正好大小span,剩余放回free.
- GC标记及回收都是对对象的span。
GC与内存管理简记
于 2024-01-04 08:49:36 首次发布