内存回收与对象共享

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时,对象所占用的内存会被释放

源码阅读

  1. 文件:src/object.c
只言片语任我说,提笔句句无需忖。落笔不知寄何人,唯有邀友共斟酌。
原文地址:https://www.cnblogs.com/phonecom/p/15129355.html