redis 能够选择行的使用 jemalloc 和tcmalloc 等linux
可是linux 下默认使用 jemalloc ,并且redis 的目录中也自带了jemalloc的库redis
在makefile 中能够看到:shell
ifeq ($(uname_S),Linux) 27 MALLOC=jemalloc 28 else 29 MALLOC=libc 30 endif
须要引入 jemalloc 的静态库:vim
makefile中能够看见:ui
feq ($(MALLOC),jemalloc) 74 DEPENDENCY_TARGETS+= jemalloc 75 FINAL_CFLAGS+= -DUSE_JEMALLOC -I../deps/jemalloc/include 76 FINAL_LIBS+= ../deps/jemalloc/lib/libjemalloc.a -ldl 77 endif
vim zmalloc.hgoogle
代码以下:spa
#if defined(USE_TCMALLOC) 39 #define ZMALLOC_LIB ("tcmalloc-" __xstr(TC_VERSION_MAJOR) "." __xstr(TC_VERSION_MINOR)) 40 #include <google/tcmalloc.h> 41 #if (TC_VERSION_MAJOR == 1 && TC_VERSION_MINOR >= 6) || (TC_VERSION_MAJOR > 1) 42 #define HAVE_MALLOC_SIZE 1 43 #define zmalloc_size(p) tc_malloc_size(p) 44 #else 45 #error "Newer version of tcmalloc required" 46 #endif 47 48 #elif defined(USE_JEMALLOC) 49 #define ZMALLOC_LIB ("jemalloc-" __xstr(JEMALLOC_VERSION_MAJOR) "." __xstr(JEMALLOC_VERSION_MINOR) " ." __xstr(JEMALLOC_VERSION_BUGFIX)) 50 #include <jemalloc/jemalloc.h> 51 #if (JEMALLOC_VERSION_MAJOR == 2 && JEMALLOC_VERSION_MINOR >= 1) || (JEMALLOC_VERSION_MAJOR > 2) 52 #define HAVE_MALLOC_SIZE 1 53 #define zmalloc_size(p) je_malloc_usable_size(p) 54 #else 55 #error "Newer version of jemalloc required" 56 #endif 57 58 #elif defined(__APPLE__) 59 #include <malloc/malloc.h> 60 #define HAVE_MALLOC_SIZE 1 61 #define zmalloc_size(p) malloc_size(p) 62 #endif 63 64 #ifndef ZMALLOC_LIB 65 #define ZMALLOC_LIB "libc" 66 #endif
查看zmalloc code
使用 HAVE_MALLOC_SIZE 判断内存分配的方式:内存
HAVE_MALLOC_SIZE 依赖:JEMALLOC_VERSION_MAJOR io
代码以下:
zmalloc.h
#if (JEMALLOC_VERSION_MAJOR == 2 && JEMALLOC_VERSION_MINOR >= 1) || (JEMALLOC_VERSION_MAJOR > 2) 52 #define HAVE_MALLOC_SIZE 1
JEMALLOC_VERSION_MAJOR 定义在jemalloc.h 中。 代码以下: 因此 HAVE_MALLOC_SIZE 的值是1 因此内存分配的方式就直接明了
#define JEMALLOC_VERSION "3.2.0-0-g87499f6748ebe4817571e817e9f680ccb5bf54a9" 11 #define JEMALLOC_VERSION_MAJOR 3 12 #define JEMALLOC_VERSION_MINOR 2 13 #define JEMALLOC_VERSION_BUGFIX 0 14 #define JEMALLOC_VERSION_NREV 0 15 #define JEMALLOC_VERSION_GID "87499f6748ebe4817571e817e9f680ccb5bf54a9"
zmalloc.c
oid *zmalloc(size_t size) { 122 void *ptr = malloc(size+PREFIX_SIZE); 123 124 if (!ptr) zmalloc_oom_handler(size); 125 #ifdef HAVE_MALLOC_SIZE //运行的是这个126 update_zmalloc_stat_alloc(zmalloc_size(ptr)); 127 return ptr; 128 #else 129 *((size_t*)ptr) = size; 130 update_zmalloc_stat_alloc(size+PREFIX_SIZE); 131 return (char*)ptr+PREFIX_SIZE; 132 #endif 133 }