GC与内存管理简记

发布时间:2024年01月04日

GC

  • V1.3之前标记清除法:先标记到不了的内存的再清除,整个过程都需要stw
    • V1.5三色并发标记法,不递归遍历,开始全标记白,每一次扫描能到的白变灰、能到的对象标记灰变黑,直到只剩下到不了的对象标记白,最后清除白对象。不需要每次都扫描整个内存空间,可以减少stw的时间
    • V1.8 混合写屏障,采用插入写屏障和删除写屏障,一次找出所有黑不重复扫描,期间新建的对象为黑色,(依赖关系)被删除和添加对象标记为灰。期间仅开启和关闭屏障各需要一次stw
      • 不stw,两个问题会破坏回收
        • 黑色对象引用白色对象—对应强三色不变性:黑色对象不会指向白色,只会指向黑或灰
        • 灰色对象到白色对象的访问路径被破坏——对应弱三色不变性:黑色对象指向的白色对象必须受灰色保护
        • 插入写屏障满足强三色不变性,不存在黑色对象引用白色对象的情况了, 因为白色会变成灰色,可以在堆上被触发,在无stw下可与go程序并行执行而不会破会垃圾回收
        • 删除写屏障满足弱三色不变性,断开处后面白色对象会变灰,保护灰色对象到白色对象的路径不会断,可以在堆上被触发,在无stw下可与go程序并行执行而不会破会垃圾回收
        • 混合写屏障满足弱三色不变性
  • 内存管理
    • 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的流程如下:
      1. 计算对象所需内存大小size
      2. 根据size到size class映射,计算出所需的size class
      3. 根据size class和对象是否包含指针计算出span class
      4. 获取该span class指向的span
    • 大于32kb在mheap上分配,优先在free搜索,没有则从scav搜索,若还没有则向os申请并从树搜索,若返回span较大,分割为正好大小span,剩余放回free.
    • GC标记及回收都是对对象的span。
文章来源:https://blog.csdn.net/zhaicheng55/article/details/135377383
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。