1,介绍和初步使用的帖子
推荐一个跨平台内存分配器tcmalloc用在3D游戏上Gperftools中tcmalloc的简介和使用
TcMalloc的介绍以及Windows下安装使用
2,深度解析的帖子
3,在VisualStudio中接入 libtcmalloc_minimal.dll
第一步,把 libtcmalloc_minimal.dll 放在合适的目录下(放在你的exe文件旁边)。
第二步,在你的工程文件中,把 libtcmalloc_minimal.lib 所在的目录路径添加到包含路径中,把 libtcmalloc_minimal.lib 添加到依赖项中。
第三步,在强制符号引用中加入:__tcmalloc,如下图所示:
第四步,重新编译你的代码。
4,当你的工程中使用了TcMalloc后,要记得关闭omit-frame-pointer优化(另一种称呼是“帧指针省略”Frame Pointer Omission,缩写为FPO)。如果启用这种优化,会使得TcMalloc在运行中出错。该优化是一种已经被淘汰的技术,在VisualStudio和GCC中都能够使用该优化。
在VisualStudio中,该优化的开关选项在这里:
想了解该优化,可以阅读下面的帖子:
FPO -frame pointer omit关于-fno-omit-frame-pointer与-fomit-frame-pointer
FPO
记一次tcmalloc分配内存引起的coredump
5,使用TcMalloc后,如果应用程序的CPU占用过高(尤其是服务器程序),有可能是TcMalloc的线程缓冲区太小了,默认的缓冲区是32M,可以修改成128M看看能否解决问题。
这个问题,在TcMalloc的官方bug单中也有描述:
Description of problem:
TCMalloc supports changing the size of the thread cache through the environmental variable TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES. This variable was not honored with TCMalloc 2.1 due to a bug, and this was the version previously provided by the Ceph repos. RHEL 7.2 has picked up TCMalloc 2.4, and the thread cache bug is resolved in this version. Increasing the TCMalloc thread cache to 128M can improve performance 4-5x.It would be great to have a way of setting the TCMalloc thread cache to 128M, instead of the default 32M.
TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES 的值默认是32M,从2.4版本开始,用户可以调整该值的大小。
当一个线程的缓冲区超过它的max_size之后,这个线程就要和其它线程竞争Central Heap分配更大的缓冲;线程的缓冲区超过max_size,表明如果提高线程的缓冲区,线程将运行的更加有效率。但如果线程缓冲区太大,又会致使大量对象闲置而浪费内存。
6,接入TcMalloc的过程非常简单,只需几处修改就能够使得TcMalloc在你的项目里正常工作。这是因为TcMalloc通过API hook钩子来实现了无缝替换原有的内存分配函数。这就意味着你的项目必须是 MD(多线程dll)或者 MDd(多线程dll调试)。