jemalloc是通用的malloc(3)实现,它强调避免碎片和可扩展的并发支持。它的源码位于https://github.com/jemalloc/jemalloc,最新稳定版本为5.2.1。
glibc的内存分配算法是基于dlmalloc实现的ptmalloc;tcmalloc是Google开发的内存分配器;jemalloc在Facebook公司内部很多项目中使用。
有时在Linux上使用glibc频繁调用malloc/free时会导致伪”内存泄漏”,此时可试试jemalloc,参考:https://zhuanlan.zhihu.com/p/270913476
windows上使用vs2017编译x64 jemalloc源码操作步骤:直接打开源码下的jemalloc_vc2017.sln编译,会报找不到jemalloc_preamble.h文件
(1).从http://www.cygwin.com/ 下载setup-x86_64.exe并安装,若下载慢,使用国内的镜像地址,如阿里云镜像http://mirrors.aliyun.com/cygwin/,安装包至少包括autoconf、autogen、gawk、grep、sed;
(2).将C:\cygwin64\bin加入系统环境变量;
(3).打开”适用于VS 2017的x64本机工具命令提示”(注意:编译x86和x64选择不同,编译x86,打开”x86 Native Tools Command Prompt for VS 2017”),并将其定位到jemalloc-5.2.1目录下,执行:$ sh -c "CC=cl ./autogen.sh";
(4).打开jemalloc_vc2017.sln编译即可生成jemalloc动态库和静态库。
Linux上编译jemalloc源码操作步骤,依次执行如下命令即可:
./configure --with-jemalloc-prefix=je_
make
以下是测试代码:
#include "funset.hpp"
#include <iostream>
#include <jemalloc/jemalloc.h>
// define to jemalloc
#define malloc(size) je_malloc(size)
#define calloc(nmemb, size) je_calloc(nmemb, size)
#define realloc(ptr, size) je_realloc(ptr, size)
#define free(ptr) je_free(ptr)
int test_jemalloc()
{
char* a = static_cast<char*>(malloc(10));
if (!a) {
fprintf(stderr, "fail to malloc\n");
return -1;
}
free(a);
return 0;
}
在windows下,debug模式,设置断点,可直接跟进源码中,如下图所示,Linux下,可通过gdb跟进: