源码位置:zmalloc.c/zmalloc.h
因为Redis没有自己实现内存池,所以系统内存分配器的性能及碎片率会对redis造成一些性能上的影响。
Redis采用了3种内存分配器:tcmalloc、jemalloc、malloc。
Redis在编译时,首先会判断是否使用tcmalloc,其次是jemalloc,如果都没有使用,则使用libc中的内存管理函数malloc。
功能函数总览
1  | void *zmalloc(size_t size); // 调用malloc函数申请size大小的内存空间(malloc不初始化,里边的数据是随机的)  | 
函数实现
1  | // 记录以使用的内存总大小,对该变量的操作都是原子操作  | 
1  | // 调用系统函数calloc申请size大小的内存空间,功能函数与zmalloc()相同  | 
1  | // 根据新的size进行内存分配,并且更新used_memory变量  | 
1  | // 释放ptr的内存空间,并更新used_memory变量  | 
1  | // 深拷贝字符串s,创建字符串副本  | 
1  | // 获取used_memory的值  | 
1  | // 可自定义分配失败时的处理方式  | 
1  | // 获取rss信息(Resident Set Size 常驻内存集)  | 
1  | // 获取jemalloc分配的信息,在jemalloc前提下使用  | 
1  | // flushdb没有通信后,让jemalloc异步清除,在jemalloc前提下使用  | 
1  | // 整理内存碎片,在jemalloc前提下使用  | 
1  | // 获取smap中的Private_Dirty(映射中已由此进程写入但未被任何其他进程引用的页面)大小  | 
1  | // 获取物理内存的大小  | 
1  | // 使用对应的内存分配器的free函数进行内存释放  |