redis 内存管理分析

redis 可以选择行的使用 jemalloc 和tcmalloc 等

但是linux 下默认使用 jemalloc ,而且redis 的目录中也自带了jemalloc的库

在makefile 中可以看到:

 

ifeq ($(uname_S),Linux)
 27   MALLOC=jemalloc
 28 else
 29   MALLOC=libc
 30 endif

需要引入 jemalloc 的静态库:

makefile中可以看见:

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.h

代码如下:

 

#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 

使用  HAVE_MALLOC_SIZE 判断内存分配的方式:

HAVE_MALLOC_SIZE  依赖:JEMALLOC_VERSION_MAJOR 

代码如下:

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 }


你可能感兴趣的:(redis 内存管理分析)