使用了thread cache,小块的内存分配都可以从cache中分配。多线程分配内存的情况下,可以减少锁竞争。
tcmalloc官方文档见:
https://gperftools.github.io/gperftools/tcmalloc.html
tcmalloc可以替换大多数系统、不同编译器环境下的内存分配函数(malloc/free/new/delete),针对不同的编译器和操作系统,替换的方式有所不同。
对于GCC编译的glibc的替换,则采用GNU C中提供的__attribute__(alias)别名机制,定义和glibc中实际调用的函数同名的函数,并将其声明为tcmalloc对应函数的别名。gcc glibc中内存分配的函数为弱符号(week symbol),在链接时便顺利被tcmalloc替代。
一般来说,通常的经验是
(1)glibc管理的内存绝大多数情况不会释放。
因此编程时如果是小内存分配要尽快使用,尽快用完,尽快释放,不要停留,否则一直摞着,线性地址后面的就形成了空洞。
(2)如果是想内存总在控制中,可以分配大内存,自行管理释放和分配。不用的时候可以释放地很干净
(3)不要分配很小的内存比如几个字节,因为一次malloc至少分配16个字节,如果每次分配都很小,就太亏了。
(4)降低M_MMAP_THRESHOLD,可以让更多的分配走mmap,避免brk得总总问题,特别是64位机器的情况下。
(5)降低M_TRIM_THRESOLD,让堆顶的空闲内存更容易释放。
网友评论