Go语言内存分配器的实现(2)

runtime·MCache_Alloc分配内存的过程是,根据参数sizeclass从list数组中取出一个内存块链表,如果这个链表不为空,就直接把第一个节点返回即可;如果链表是空,说明cache中没有满足此类大小的缓存内存,这个时候就调用runtime·MCentral_AllocList从central中获取 一批 此类大小的内存块,再把第一个节点返回使用,其他剩余的内存块挂到这个链表上,为下一次分配做好缓存。

cache上的内存分配逻辑很简单,就是cache取不到就到central中去取。除了内存的分配外,cache上还存在很多的状态计数器,主要是用来统计内存的分配情况,比如:分配了多少内存,缓存了多少内存等等。这些状态计数器非常重要,可以用来监控我们程序的内存管理情况以及profile等,runtime包里的MemStats类的数据就是来自这些底层的计数器。

cache的释放条件主要有两个,一是当某个内存块链表过长(>=256)时,就会截取此链表的一部分节点,返还给central;二是整个cache缓存的内存过大(>=1M),同样将每个链表返还一部分节点给central。

cache层在进行内存分配和释放操作的时候,是没有进行加锁的,也不需要加锁,因为cache是每个线程独享的。所以cache层的主要目的就是提高小内存的频繁分配释放速度。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5ad9da19dfeb9fa8b3dee16dd30e48ee.html