zoukankan      html  css  js  c++  java
  • 内存回收与对象共享

    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
    只言片语任我说,提笔句句无需忖。落笔不知寄何人,唯有邀友共斟酌。
  • 相关阅读:
    ubuntu下 apt-get install 下载的文件存放的目录
    ubuntu 上更新安装 openoffice.org3的过程
    ubuntu中flash的中文乱码解决方法
    ubuntu 安装AMP环境的笔记 Prefork方式与fast-cgi方法
    socket 基础知识
    php 处理透明背景的图片时的问题
    RHEL 8 Speculation
    心之力
    (OK) 在内核中,获得 某目的地址的下一跳的数目,kernel 4.4
    Linux内核分析
  • 原文地址:https://www.cnblogs.com/phonecom/p/15129355.html
Copyright © 2011-2022 走看看