文章目录 前言: allocator zmalloc.h中的函数声明 alloc zmalloc 注1:PREFIX_SIZE 注2:oom处理方法 注3:update_zmalloc_stat_alloc...方法 注4:atomicIncr方法 zcalloc zrealloc 注5:zfree方法 注6:zmalloc_size方法 注7:update_zmalloc_stat_free方法 注8:update_zmalloc_stat_alloc...zmalloc.h中的函数声明 zmalloc.h中出了allocator的选择,还有alloc的函数声明: (截取) void *zmalloc(size_t size); /* 调用zmalloc...zmalloc /* 调用zmalloc申请size个大小的空间 */ void *zmalloc(size_t size) { void *ptr = malloc(size+PREFIX_SIZE...//HAVE_MALLOC_SIZE,往前翻翻 update_zmalloc_stat_alloc(zmalloc_size(ptr)); //更新used_memory的大小 zmalloc_size
(void) { zmalloc_thread_safe = 1; } 相应的,线程安全的方法update_zmalloc_stat_add和update_zmalloc_stat_free...(0) 之后我们在堆上分配释放空间时,就需要使用update_zmalloc_stat_alloc和update_zmalloc_stat_free方法实时更新堆空间申请的情况。...ptr) zmalloc_oom_handler(size); #ifdef HAVE_MALLOC_SIZE update_zmalloc_stat_alloc(zmalloc_size(ptr...newptr) zmalloc_oom_handler(size); update_zmalloc_stat_free(oldsize); update_zmalloc_stat_alloc...当然它也有自己默认的处理逻辑: static void (*zmalloc_oom_handler)(size_t) = zmalloc_default_oom; static void zmalloc_default_oom
,zfree一系列函数,其相应的源代码在src/zmalloc.h和src/zmalloc.c两个文件里,源代码点这里。...(p) malloc_size(p) #endif #ifndef ZMALLOC_LIB #define ZMALLOC_LIB "libc" #endif ......)); float zmalloc_get_fragmentation_ratio(void); size_t zmalloc_get_rss(void); size_t zmalloc_get_private_dirty...ptr) zmalloc_oom_handler(size); #ifdef HAVE_MALLOC_SIZE update_zmalloc_stat_alloc(zmalloc_size(ptr...zmalloc_calloc、zmalloc_free等的实现就不细致介绍了详情參见源代码。 最后解说下 zmalloc_get_rss()函数。 这个函数用来获取进程的RSS。神马是RSS?
、zmalloc.c,源码下载地址为https://github.com/readywang/Redis3.0。.../* 非线程安全条件下zmalloc分配内存时更新使用内存字节数 */ #define update_zmalloc_stat_add(__n) do { \ pthread_mutex_lock..._n += sizeof(long)-(_n&(sizeof(long)-1)); \ if (zmalloc_thread_safe) { \ update_zmalloc_stat_sub...used_memory的值,update_zmalloc_stat_free负责在释放内存后减少used_memory的值,输入参数_n即为新增或者减少的内存。...ptr) zmalloc_oom_handler(size); #ifdef HAVE_MALLOC_SIZE update_zmalloc_stat_alloc(zmalloc_size(ptr
Redis 使用 zmalloc 方法(Redis 自己实现的内存分配方法)进行内存分配的时候,除了要分配 size 大小的内存之外,还会多分配 PREFIX_SIZE 大小的内存。...zmalloc 方法源码如下(源码地址:https://github.com/antirez/redis-tools/blob/master/zmalloc.c): void *zmalloc(size_t...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);
---- 自我测评 这是redis的空间配置器中的一段代码,大家自己看一下能否心领神会: #ifndef __ZMALLOC_H #define __ZMALLOC_H /* Double expansion...macro values. */ #define __xstr(s) __str(s) #define __str(s) #s #if defined(USE_TCMALLOC) #define ZMALLOC_LIB...&& JEMALLOC_VERSION_MINOR >= 1) || (JEMALLOC_VERSION_MAJOR > 2) #define HAVE_MALLOC_SIZE 1 #define zmalloc_size...(p) malloc_size(p) #endif #ifndef ZMALLOC_LIB #define ZMALLOC_LIB "libc" #ifdef __GLIBC__ #include #define HAVE_MALLOC_SIZE 1 #define zmalloc_size(p) malloc_usable_size(p) #endif #endif ----
size大小的内存,前面sizeof(size_t)个字节记录本次分配的大小, 记录分配的总内存大小,返回用于存储数据的内存首地址,即跨过sizeof(size_t)大小个字节 */ void *zmalloc...size_t oldsize; void *newptr; // ptr为空即没有旧数据,新申请一块内存即可,不涉及数据迁移 if (ptr == NULL) return zmalloc...free(realptr); } // 复制字符串 char *zstrdup(const char *s) { size_t l = strlen(s)+1; char *p = zmalloc...(l); memcpy(p,s,l); return p; } size_t zmalloc_used_memory(void) { return used_memory;
Redis 2.6.9 安装报错,提示: zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory...zmalloc.h:55:2: error: #error "Newer version of jemalloc required" make[1]: *** [adlist.o
. */ if (zmalloc_used_memory() > server.stat_peak_memory) server.stat_peak_memory = zmalloc_used_memory...* We must sample the zmalloc_used at the same time we take the rss, otherwise * the...be off (ratio of two samples at different times) */ server.cron_malloc_stats.process_rss = zmalloc_get_rss...(); server.cron_malloc_stats.zmalloc_used = zmalloc_used_memory(); /* Sampling the allcator...server.cron_malloc_stats.allocator_resident) { /* LUA memory isn't part of zmalloc_used,
源代码 sds sdsnewlen(const void *init, size_t initlen) { >struct sdshdr *sh; >if (init) { > sh = zmalloc...) > memcpy(sh->buf, init, initlen); >sh->buf[initlen] = '\0'; >return (char*)sh->buf; } 因为原函数中的zmalloc...()函数和zcalloc()函数的具体实现比较复杂,所以为了先能更好的理解sdsnewlen()函数的功能,下面我将源代码中的zmalloc()和zcalloc()进行替换。
1 新建一个链表 // 新建一个链表头结点 list *listCreate(void) { struct list *list; if ((list = zmalloc(sizeof...listAddNodeHead(list *list, void *value) { listNode *node; // 分配一个新的listNode节点 if ((node = zmalloc...给链表新增一个节点,尾插法 list *listAddNodeTail(list *list, void *value) { listNode *node; if ((node = zmalloc...申请一个链表迭代器 listIter *listGetIterator(list *list, int direction) { listIter *iter; if ((iter = zmalloc
just in case the calling app didn't initialize */ // 创建 eventLoop 并分配内存空间 if ((eventLoop = zmalloc...(sizeof(*eventLoop))) == NULL) goto err; eventLoop->events = zmalloc(sizeof(aeFileEvent) * setsize...); eventLoop->fired = zmalloc(sizeof(aeFiredEvent) * setsize); if (eventLoop->events == NULL...state) return -1; // 将 epoll_event 数组保存在 aeApiState 中 state->events = zmalloc(sizeof(struct epoll_event...return; } } createClient 函数会创建监听事件: client *createClient(connection *conn) { client *c = zmalloc
redis在zmalloc.h,zmalloc.c中做了封装,另外还可以使用tcmalloc,jemalloc(redis已经把jemalloc的代码集成在了deps/jemalloc/目录下)。...另外,在zmalloc中,还实现了一定的内存分析能力: ? 原理很简单,就是分析/proc/self/smaps文件。...zmalloc给用户提供了更多的malloc使用选择;但是,这也就变相说明了redis没有slab能力(相比之下,memcached则实现了slab)。
make[1]: Entering directory `/root/redis-3.0.4/src‘ CC adlist.o In file included from adlist.c:34: zmalloc.h...:50:31: error: jemalloc/jemalloc.h: No such file or directory zmalloc.h:55:2: error: #error "Newer version
比如Redis源码中就有大量的这种用法,下面这段出自zmalloc的源码: #define update_zmalloc_stat_alloc(__n) do { \ size_t _n = (...__n); \ if (_n&(sizeof(long)-1)) _n += sizeof(long)-(_n&(sizeof(long)-1)); \ if (zmalloc_thread_safe...) { \ update_zmalloc_stat_add(_n); \ } else { \ used_memory += _n; \ } \ } while
REDISMODULE_OK; } object.c创建对象 robj *createModuleObject(moduleType *mt, void *value) {moduleValue *mv = zmalloc...parsing of objects ==================== */ robj *createObject(int type, void *ptr) { robj *o = zmalloc
只是申请了一个list结构体空间,然后各个字段设置为NULL list *listCreate(void) { struct list *list; if ((list = zmalloc...还要让链表的头尾指针都指向新增的节点 list *listAddNodeHead(list *list, void *value) { listNode *node; if ((node = zmalloc...return list; } list *listAddNodeTail(list *list, void *value) { listNode *node; if ((node = zmalloc...listInsertNode(list *list, listNode *old_node, void *value, int after) { listNode *node; if ((node = zmalloc...指针指向链表的头结点或者尾节点 listIter *listGetIterator(list *list, int direction) { listIter *iter; if ((iter = zmalloc
Redis的内存管理主要通过源码中zmalloc.h和zmalloc.c两个文件来实现的。Redis为了方便内存的管理,在分配一块内存之后,会将这块内存的大小存入内存块的头部。...Redis通过定义一个数组来记录所有的内存分配情况,这个数组的长度为ZMALLOC_MAX_ALLOC_STAT。数组的每一个元素代表当前程序所分配的内存块的个数,且内存块的大小为该元素的下标。...在源码中,这个数组为zmalloc_allocations。zmalloc_allocations[16]代表已经分配的长度为16bytes的内存块的个数。...zmalloc.c中有一个静态变量used_memory用来记录当前分配的内存总大小。
领取专属 10元无门槛券
手把手带您无忧上云