TCMalloc
本文主要是对于TCMalloc内存分配论文的学习, 英文论文Thread-Caching Malloc见地址:http://goog-perftools.sourceforge.net/doc/tcmalloc.html
Motivation
根据我已做的测试,TCMalloc比gclib2.3里面的malloc(ptmalloc2)和其余的mollocs速度更加的快。在2.8GHz的处理器上,针对小对象(小于32Kb)ptmalloc2做一次malloc/free的操作,需要大概300ns,而TCMalloc同样的操作需要大约50ns。由此可见TCMalloc的速度优势。
在多线程环境下,TCMalloc可以极大减少锁资源的争夺。针对small object,TCMalloc几乎就是lock free的。针对large object,TCMalloc采用高效的细粒度的自旋锁。
ptmalloc2也使用线程私有内存区域来减少锁的竞争,但是有一个很严重的问题,ptmalloc2线程私有的内存区域不能从一个线程私有内存区域移动到另外一个线程私有内存区域,这会造成很严重的内存浪费。例如,在一个谷歌应用程序中,第一阶段将为其数据结构分配大约300MB的内存。当第一阶段完成时,第二阶段将在相同的地址空间中启动。如果将第二个阶段分配到的内存区域与第一个阶段所使用的内存区域不同,那么第二阶段将不会重用第一个阶段之后剩下的任何内存,并将向地址空间添加另一个300MB。在其他应用程序中也发现了类似的内存爆炸问题。
Overview
TCMalloc为每个线程指定了一个thread local cache,小对象的内存分配直接走thread local cache。 根据需要,将对象从central data structures 移动到thread local cache,并且使用定期garbage collection将内存从thread local cache迁移回central data structures。
TCMalloc默认将size小于32KB的对象