Redis学习:zmalloc内存管理 (一)

水平有限,一家之言,欢迎斧正。

zmalloc 是Redis的基础。Redis内存管理通过在zmalloc.h和zmalloc.c中重写c语言对内存的管理来完成的,主要是对tcmalloc(google)、jemalloc(facebook)、其他(mac系统等)的封装。

注:redis-2.4以上自带jemalloc。

编译时选择malloc

<!-- lang: cpp -->
<!-- lang: cpp -->
#if defined(USE_TCMALLOC)
#define ZMALLOC_LIB ("tcmalloc-" __xstr(TC_VERSION_MAJOR) "." __xstr(TC_VERSION_MINOR))
#include <google/tcmalloc.h>
#if (TC_VERSION_MAJOR == 1 && TC_VERSION_MINOR >= 6) || (TC_VERSION_MAJOR > 1)
#define HAVE_MALLOC_SIZE 1
#define zmalloc_size(p) tc_malloc_size(p)
#else
#error "Newer version of tcmalloc required"
#endif

#elif defined(USE_JEMALLOC)
#define ZMALLOC_LIB ("jemalloc-" __xstr(JEMALLOC_VERSION_MAJOR) "." __xstr(JEMALLOC_VERSION_MINOR) "." __xstr(JEMALLOC_VERSION_BUGFIX))
#include <jemalloc/jemalloc.h>
#if (JEMALLOC_VERSION_MAJOR == 2 && JEMALLOC_VERSION_MINOR >= 1) || (JEMALLOC_VERSION_MAJOR > 2)
#define HAVE_MALLOC_SIZE 1
#define zmalloc_size(p) je_malloc_usable_size(p)
#else
#error "Newer version of jemalloc required"
#endif

#elif defined(__APPLE__)
#include <malloc/malloc.h>
#define HAVE_MALLOC_SIZE 1
#define zmalloc_size(p) malloc_size(p)
#endif

由USE_TCMALLOC、USE_JEMALLOC和APPLE控制使用哪种malloc。

而这三个常量在Makefile中定义。

以redis-server为例:

使用TCMalloc优化redis只需:

make USE_TCMALLOC=yes

<!-- lang: shell -->
#默认参数
ifeq ($(uname_S),Linux)
    MALLOC=jemalloc
else
    MALLOC=libc
endif
……
#判断使用的MALLOC
ifeq ($(USE_TCMALLOC),yes)
    MALLOC=tcmalloc
endif

ifeq ($(USE_TCMALLOC_MINIMAL),yes)
    MALLOC=tcmalloc_minimal
endif

ifeq ($(USE_JEMALLOC),yes)
    MALLOC=jemalloc
endif
…………
……
##加上相应的编译参数
ifeq ($(MALLOC),tcmalloc)
FINAL_CFLAGS+= -DUSE_TCMALLOC
FINAL_LIBS+= -ltcmalloc
endif

ifeq ($(MALLOC),tcmalloc_minimal)
    FINAL_CFLAGS+= -DUSE_TCMALLOC
    FINAL_LIBS+= -ltcmalloc_minimal
endif

ifeq ($(MALLOC),jemalloc)
    DEPENDENCY_TARGETS+= jemalloc
    FINAL_CFLAGS+= -DUSE_JEMALLOC -I../deps/jemalloc/include
    FINAL_LIBS+= ../deps/jemalloc/lib/libjemalloc.a -ldl
endif
………………
### 最后组合命令
……
$(REDIS_SERVER_NAME): $(REDIS_SERVER_OBJ)
$(REDIS_LD) -o $@ $^ ../deps/hiredis/libhiredis.a ../deps/lua/src/liblua.a $(FINAL_LIBS)

你可能感兴趣的:(redis,内存管理,编译,zmalloc)