02.1跟雨痕看go源码-内存分配(分配&回收)
内存分配和垃圾回收有关,这里我们可以先看一下内存分配。 一开始雨痕大大说了几个基本策略:
里面提到了两个概念 ????golang直接采用tcmalloc的成熟架构。 cache是每个golang里面的P搞一个,提供一个无锁分配。 然后central根据sizeclass的大小,把所有中等的object分成若干等级,然后在这里做其中一级缓存,减少计算量。。 heap则是最后一道缓存,在这里发起回收和mmap申请。 然后雨痕给了图说明的内存分布以及初始化的过程。 cache部分的逻辑:从代码中可以看出tiny&large object做了特定的处理。tiny是使用classsize=2的span,然后里面使用尽量共享空间,希望一个object能够多复用几次。用cache.tinyoffset,cache.tiny进行控制。 大对象则直接使用堆分配。。 同时还介绍了一个 mcentral部分的逻辑:这个家伙内部也有两个小缓存。 mheap部分的逻辑:和预料的基本一致,作为最后一级的缓存。会先考虑自己的free,不行了,才考虑向系统申请。里面的freelarge是个链表在free没有的时候,会用freelarge,顺序遍历链表找出最合适(在大于目标size里面最小)的freelarge。 ##回收上来就一个综述:回收不会盯着object而是整个span。 释放这里的入口有sysmon发起。每5分钟都来一次。 其他大概就是还有四块系统的部分也需要垃圾回收。 它们自己内部也弄了个二级缓存。 这里就比较简单了,是fix size的,没有span、object、classsize,第一级别用了而是一个chunk,还有复用的list。。。第二级就是使用chunk。 还有个什么record的函数。 大概就是为了提高span的便利效率而做了一个数组类型的h_spans,然后在特定条件下引发扩容,每次扩容 A*3/2 +1。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |