記憶體回收與物件共享 - 《Redis設計與實現》讀書筆記
阿新 • • 發佈:2021-08-11
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