W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
因為 C 語言并不具備自動的內(nèi)存回收功能, 所以 Redis 在自己的對象系統(tǒng)中構建了一個引用計數(shù)(reference counting)技術實現(xiàn)的內(nèi)存回收機制, 通過這一機制, 程序可以通過跟蹤對象的引用計數(shù)信息, 在適當?shù)臅r候自動釋放對象并進行內(nèi)存回收。
每個對象的引用計數(shù)信息由 redisObject
結(jié)構的 refcount
屬性記錄:
typedef struct redisObject {
// ...
// 引用計數(shù)
int refcount;
// ...
} robj;
對象的引用計數(shù)信息會隨著對象的使用狀態(tài)而不斷變化:
1
;0
時, 對象所占用的內(nèi)存會被釋放。表 8-12 列出了修改對象引用計數(shù)的 API , 這些 API 分別用于增加、減少、重置對象的引用計數(shù)。
表 8-12 修改對象引用計數(shù)的 API
函數(shù) | 作用 |
---|---|
incrRefCount |
將對象的引用計數(shù)值增一。 |
decrRefCount |
將對象的引用計數(shù)值減一, 當對象的引用計數(shù)值等于 0 時, 釋放對象。 |
resetRefCount |
將對象的引用計數(shù)值設置為 0 , 但并不釋放對象, 這個函數(shù)通常在需要重新設置對象的引用計數(shù)值時使用。 |
對象的整個生命周期可以劃分為創(chuàng)建對象、操作對象、釋放對象三個階段。
作為例子, 以下代碼展示了一個字符串對象從創(chuàng)建到釋放的整個過程:
// 創(chuàng)建一個字符串對象 s ,對象的引用計數(shù)為 1
robj *s = createStringObject(...)
// 對象 s 執(zhí)行各種操作 ...
// 將對象 s 的引用計數(shù)減一,使得對象的引用計數(shù)變?yōu)?0
// 導致對象 s 被釋放
decrRefCount(s)
其他不同類型的對象也會經(jīng)歷類似的過程。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: