内存回收与对象共享 - 《Redis设计与实现》读书笔记
Redis在对象系统中构架了一个引用计数计数实现了内存回收机制
和 对象共享机制
基于引用计数技术的 内存回收机制
程序通过跟踪对象的引用计数信息,在适当的时候自动释放对象并进行内存回收
基于引用计数技术的 对象共享机制
共享对象机制对于节约内存非常有帮助,数据库中保存的相同值对象越多,对象共享就越能节约越多的内存,
Redis在
初始化服务器时,会创建一万个字符串对象
,这些对象包含了从0到9999的所有整数值,当服务器需要用到值为0到9999的字符串对象时,服务器就会使用这些共享对象,而不是新创建对象,
在数据结构嵌套了字符串对象的对象都可以使用这些共享对象
由于检查对象是否相等而造成的CPU时间限制,Redis只对包含整数值的字符串对象
进行共享,创建共享字符串对象的数量可以通过修改src/server.h/OBJ_SHARED_INTEGERS常量
进行调整
实现原理
每个对象的引用计数信息由redisObject结构的refcount属性记录:
typedef struct redisObject {
// ...
// 引用计数
int refcount;
// ...
} robj;
对象的引用计数信息会随着对象的使用状态而不断变化
- 在创建一个新对象时,引用计数的值会被初始化为 1
- 当对象被一个新程序使用时,调用incrRefCount,引用计数的值会被 +1
- 当对象不再被程序使用时,调用decrRefCount,引用计数的值会被 -1
- 当对象的引用计数值变为0时,对象所占用的内存会被释放
源码阅读
- 文件:src/object.c
只言片语任我说,提笔句句无需忖。落笔不知寄何人,唯有邀友共斟酌。