GO开发:GIN面试题( 二 )

  • 另外 , Go语言是一个支持 goroutine 这种多线程的语言 , 所以它的内存管理系统必须要考虑在多线程下的稳定性和效率问题 。
  • 在多线程方面很自然的做法就是每条线程都有自己的本地的内存 , 然后有一个全局的分配链 , 当某个线程中的内存不足后就向全局分配链中申请内存 。这样就避免了多线程同时访问共享变量的加锁 。
    在避免内存碎片方面 , 大块内存直接按页为单位分配 , 小块内存会切成各种不同的固定大小的块 , 申请做任意字节内存时会向上取整到最接近的块 , 将整块分配给申请者以避免随意切割 。
    在避免内存碎片方面大块内存直接按页为单位分配 , 小块内存会切成各种不同的固定大小的块 , 申请做任意字节内存时会向上取整到最接近的块 , 将整块分配给申请者以避免随意切割 。
    Go语言中为每个系统线程分配一个本地的 MCahe , 少量的地址分配就直接从 MCache 中分配 , 并且定期做垃圾回收 , 将线程的 MCache 中的空闲内存返回给全局控制堆 。小于 32K为小对象 , 大对象直接从全局控制堆上以页(4k)为单位进行分配 , 也就是说大对象总是以页对齐的 。一个页可以存入一些相同大小的小对象 , 小对象从本地内存链表中分配 , 大对象从中心内存对分配 。
    大约有 100 种内存块类别 , 每一个类别都有自己对象的空闲链表 。小于 32KB 的内存分配被向上取整到对应的尺寸类别 , 从相应的空闲链表中分配 。一页内存只可以被分裂成同一种尺寸类别的对象 , 然后由空间链表分配管理器 。
    大约有 100 种内存块类别 , 每一个类别都有自己对象的空闲链表 。小于 32kB 的内存分配被向上取整到对应的尺寸类别 , 从相应的空闲链表中分配 。一页内存只可以被分裂成同一种尺寸类别的对象 , 然后由空闲链表分配器管理 。
    分配器的数据结构包括: 


    推荐阅读