Golang内存管理

  • 架构
    三层架构
        - mcache: 逻辑处理器(P)私有缓存,用于快速分配小对象。
        - mcentral: 所有逻辑处理器(P)共享的中央缓存,为mcache提供内存。
        - mheap: 程序全局堆,整个程序共享的一片虚拟地址空间。
  • 内存分配
    分配单位:
        - mspan: 真正存储对象的内存块。
    内存分页:
        - 8kb每页
    分配规则:
      - 大于32kb的对象,直接分配到mheap,即堆中。
      - 小于32kb的对象,先尝试从mcache中寻找合适的mspan,没有则向上申请空间,从mcentral到mheap,直到可以拿到合适的mspan。
      - 逃逸分析。编译阶段golang会做内存逃逸分析,超过32kb的对象会隐式逃逸(对应第一点),对象影响范围超出作用域(如函数返回对象指针)也会发生逃逸。逃逸分析可以预先确认对象是否需要分配到堆上,减少内存分配开销。
      
    特殊规则:
        - chan类型总是分配在堆上,因为chan设计用于跨栈通信,影响范围通常都会超出作用域。 
  • 内存回收
    三色标记清除法,详细介绍如下:
    https://www.cnblogs.com/CJTARRR/p/19059066

     

posted @ 2025-08-27 11:04  CJTARRR  阅读(6)  评论(0)    收藏  举报