Redis源码分析-TCMalloc

本文详细介绍了Redis中使用TCMalloc的内存管理,包括如何通过编译选项接入,Tcmalloc的内存分配策略,如线程局部缓冲、小对象与大对象的区分,以及内存回收机制。此外,还提到了Tcmalloc的内存泄露检测工具heap checker的使用,并讨论了其在内存效率和性能上的优势。
摘要由CSDN通过智能技术生成

redis很多地方都在调用zmalloc函数

zmalloc在这里定义zmalloc.c

void *zmalloc(size_t size) {
    void *ptr = malloc(size+PREFIX_SIZE);

    if (!ptr) zmalloc_oom_handler(size);
#ifdef HAVE_MALLOC_SIZE
    update_zmalloc_stat_alloc(zmalloc_size(ptr));
    return ptr;
#else
    *((size_t*)ptr) = size;
    update_zmalloc_stat_alloc(size+PREFIX_SIZE);
    return (char*)ptr+PREFIX_SIZE;
#endif
}


malloc的定义

/* Explicitly override malloc/free etc when using tcmalloc. */
#if defined(USE_TCMALLOC)
#define malloc(size) tc_malloc(size)
#define calloc(count,size) tc_calloc(count,size)
#define realloc(ptr,size) tc_realloc(ptr,size)
#define free(ptr) tc_free(ptr)
#elif defined(USE_JEMALLOC)
#define malloc(size) je_malloc(size)
#define calloc(count,size) je_calloc(count,size)
#define realloc(ptr,size) je_realloc(ptr,size)
#define free(ptr) je_free(ptr)
#endif

 

编译时的src目录下的makefile文件中的选项:

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

 

将tcmalloc通过“-ltcmalloc”链接器标志接入模块

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值