在所有申请的指定长度的内存前加了一个sizeof(size_t)
的长度
用于记录实际申请的内存长度,
方便统计内存使用占用和内存使用状态分析
相关文件
- zmalloc.h
- zmalloc.c
相关概念
- RSS
Resident Set Size,进程实际锁驻留在内存的空间大小,不包括交换区数据(swap)值
RSS = Shared_Clean + Shared_Dirty + Private_Clean + Private_Dirty- Shared_Clean
多进程共享内存,且其内容未被任意进程修改 - Shared_Dirty
多进程共享内存,且其内容已经被某个程序修改 - Private_Clean
进程独享内存,且其内容未被修改 - Private_Dirty
进程独享内存,且其内容已经被修改
- Shared_Clean
- 内存碎片
- 内部碎片
已经被分配给程序进程的,不能被操作系统使用的内存 - 外部碎片
没有分配给程序进程,但是因为连续空间过小导致无法使用的内存
- 内部碎片
/proc/self/*
与/proc/$pid/
系统使用self
来代替$pid
,实际上两个目录一样的.不同的进程调用self
是对应的文件夹连接就是自己的$pid
文件夹连接- 共享内存
在Linux中主要是.so
动态库文件,还有一些其他内容 - 内存对齐
系统版本与CPU同时决定对齐的位数
x86是4,x64是8
gcc中申请的内存默认都是要对齐的,不足位数的需要凑齐为对齐位数的整数倍
(可以使用__attribute__ ((__packed__))
来强制不对齐)
函数分析
void *zmalloc(size_t size);
功能
申请指定大小的内存,不会初始化
源码
1 | static size_t used_memory = 0; |
static void zmalloc_default_oom(size_t size);
功能
Redis默认内存Out Of Memory
的处理函数
源码
1 | static void zmalloc_default_oom(size_t size) { |
#define update_zmalloc_stat_alloc(__n)
功能
记录实际使用的内存的大小(增加)
源码
1 |
|
#define update_zmalloc_stat_add(__n)
功能
保证线程安全的增加used_memory
源码
1 |
|
void *zcalloc(size_t size);
功能
同zmalloc
一样,但是会将所申请的所有内存初始化为0
源码
1 | void *zcalloc(size_t size) { |
void *zrealloc(void *ptr, size_t size);
功能
重新分配指针的数据的长度,不会初始化新增数据
源码
1 | void *zrealloc(void *ptr, size_t size) { |
#define update_zmalloc_stat_free(__n)
功能
记录实际使用的内存的大小(减少)
源码
1 |
|
#define update_zmalloc_stat_sub(__n)
功能
保证线程安全的减小used_memory
源码
1 |
|
void zfree(void *ptr);
功能
释放指针空间
源码
1 | void zfree(void *ptr) { |
char *zstrdup(const char *s);
功能
字符串复制(因为复制的原始字符串结尾是什么,这里复制出的字符串结尾就是什么(一定是\0
))
源码
1 | char *zstrdup(const char *s) { |
size_t zmalloc_used_memory(void);
功能
获取当前已经使用的内存大小(字节)(used_memory的值)
源码
1 | size_t zmalloc_used_memory(void) { |
void zmalloc_enable_thread_safeness(void);
功能
开启内存用量记录的线程安全模式(开启后所有内存用量记录都会上锁)
源码
1 | static int zmalloc_thread_safe = 0; |
void zmalloc_set_oom_handler(void (*oom_handler)(size_t));
功能
设置内存溢出触发时的回调函数
源码
1 | static void (*zmalloc_oom_handler)(size_t) = zmalloc_default_oom; |
float zmalloc_get_fragmentation_ratio(size_t rss);
功能
获取当前Redis的内存碎片率(内部碎片)
源码
1 | float zmalloc_get_fragmentation_ratio(size_t rss) { |
size_t zmalloc_get_rss(void);
功能
通过系统信息截取到当前Redis使用的RSS(Resident Set Size)(进程实际所驻留在内存的空间大小,不包括交换区数据(swap))值
源码
1 | size_t zmalloc_get_rss(void) { |
size_t zmalloc_get_private_dirty(void);
功能
获取当前Redis所有私有的已实际使用过的内存的大小(字节)
源码
1 | size_t zmalloc_get_private_dirty(void) { |
size_t zmalloc_get_smap_bytes_by_field(char *field);
功能
根据参数字段,在/proc/self/smaps
中(就是当前进程的smaps文件)中查找对应的属性的值
源码
1 | size_t zmalloc_get_smap_bytes_by_field(char *field) { |
size_t zmalloc_get_memory_size(void);
功能
简洁的获得物理内存尺寸(单位:字节)(跨平台)
源码
1 | size_t zmalloc_get_memory_size(void) { |
void zlibc_free(void *ptr);
功能
libc的free的封装(This is useful for instance to free results obtained by backtrace_symbols())
源码
1 | void zlibc_free(void *ptr) { |
size_t zmalloc_size(void *ptr)
功能
获取按位对齐后的实际指针所占用的总内存量
源码
1 | size_t zmalloc_size(void *ptr) { |