TCMalloc是一个比glibc2.3的malloc更快的内存管理库,通常ptmalloc2能在300纳秒执行一个malloc/free对,而TCMalloc能在50纳秒内执行一个分配对。
TCMalloc以能减少多线程程序之间的锁争用问题,在小对象上能达到零争用。
TCMalloc为每一个线程分配一个线程本地cache,少量的地址分配就直接从cache中分配,并且定期做垃圾回收,将线程本地cache中的空闲内存,返回给全局控制堆。
TCMalloc认为 size<=32K的为小对象,大对象直接从全局控制堆中以页(4K)为单位进行分配, 以就是说大对象总是页对齐的。
一个页能存入一些相同大小的小对象,实例中,一个页中存入了32个128bytes的小对象。
小对像的分配:将0-32K之间分为170个大小类别,当要申请内存时,舍入到一个合适的大小类别中。每一个线程有一个自己的内存使用链表,当分配一个小对象时,从中心内存中分配内存并加入到线程的本地内存链表中。
大对象的分配:大对象直接从中心内存堆中分配,以4K页为单位,并以连续的内存块分配 ,称为一个spens,一个spens包括连续的多个4K页.
使用:
TCMalloc以能减少多线程程序之间的锁争用问题,在小对象上能达到零争用。
TCMalloc为每一个线程分配一个线程本地cache,少量的地址分配就直接从cache中分配,并且定期做垃圾回收,将线程本地cache中的空闲内存,返回给全局控制堆。
TCMalloc认为 size<=32K的为小对象,大对象直接从全局控制堆中以页(4K)为单位进行分配, 以就是说大对象总是页对齐的。
一个页能存入一些相同大小的小对象,实例中,一个页中存入了32个128bytes的小对象。
小对像的分配:将0-32K之间分为170个大小类别,当要申请内存时,舍入到一个合适的大小类别中。每一个线程有一个自己的内存使用链表,当分配一个小对象时,从中心内存中分配内存并加入到线程的本地内存链表中。
大对象的分配:大对象直接从中心内存堆中分配,以4K页为单位,并以连续的内存块分配 ,称为一个spens,一个spens包括连续的多个4K页.
使用: