源码位置: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函数进行内存释放 |