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 }