模块特性
==》支持内存分配配置
==》支持线程安全
==》支持内存分配失败异常处理流程自定义
==》支持字符串复制操作
==》支持当前内存大小占用记录
==》支持内存碎片化计算
==》支持系统内存相关数据查询
内存分配算法配置
==》支持tcmalloc:http://gperftools.googlecode.com/svn/trunk/doc/tcmalloc.html
==》支持jemalloc:http://www.canonware.com/jemalloc/
==》支持ptmalloc(glibc):http://www.malloc.de/en/
如果对上述具体原理感兴趣,可以进一步阅读链接,希望我也能有空去看看这些具体实现,如果有机会的话。
内存操作基本接口
void *zmalloc(size_t size);
分配一块内存,并在真正的指针头上记录指针指向内存的长度。如果内存分配失败直接程序异常处理。
void *zcalloc(size_t size);
分配一块清零内存,并在真正的指针头上记录指针指向内存的长度。如果内存分配失败直接程序异常处理。
void *zrealloc(void *ptr, size_t size);
空指针相当于zmalloc函数。变更ptr指向内存的大小,返回变更后内存的指针,新旧指针可能不同。如果内存分配失败直接程序异常处理。
void zfree(void *ptr);
释放指针指向的内存块。
size_t zmalloc_size(void *ptr);
获取指针指向内存区域的大小。ptr未做保护,NULL指针可能导致程序crash。
char *zstrdup(const char *s);
字符串内存memcpy复制。
size_t zmalloc_used_memory(void);
获取zmalloc当前所使用掉的内存总量。
void zmalloc_enable_thread_safeness(void);
使能线程安全,确保统计数据正确性。
void zmalloc_set_oom_handler(void (*oom_handler)(size_t));
定制内存分配失败策略。Redis采用了自己的redisOutOfMemoryHandler处理函数,从日志记录上打印了crash的文件行数。
size_t zmalloc_get_rss(void);
获取进程常驻物理内存。
float zmalloc_get_fragmentation_ratio(size_t rss);
计算实际内存使用率。
size_t zmalloc_get_smap_bytes_by_field(char *field);
根据filed字段获取进程相关数据。
size_t zmalloc_get_private_dirty(void);
获取Private_Dirty字段的值。
void zlibc_free(void *ptr);
原始的libcfree函数实现。