メモリ回収

2262 ワード

C言語は自動メモリ回収機能を備えていないため,Redisは自分のオブジェクトシステムにおいて参照カウント(reference counting)技術によって実現されるメモリ回収メカニズムを構築し,このメカニズムにより,プログラムはオブジェクトの参照カウント情報を追跡し,適切なときに自動的にオブジェクトを解放してメモリ回収を行うことができる.
各オブジェクトの参照カウント情報は、redisObject構造のrefcount属性によって記録されます.
typedef struct redisObject {

    // ...

    //     
    int refcount;

    // ...

} robj;

オブジェクトの参照カウント情報は、オブジェクトの使用状況に応じて変化します.
新しいオブジェクトを作成すると、参照カウントの値が1に初期化されます.
オブジェクトが新しいプログラムで使用されると、参照カウント値が1つ増加します.
オブジェクトがプログラムで使用されなくなると、参照カウント値が1つ減少します.
オブジェクトの参照カウント値が0になると、オブジェクトが使用するメモリが解放されます.
表8〜12は、オブジェクトの参照カウントを増加、減少、リセットするために使用されるオブジェクト参照カウントを変更するAPIを示す.
表8-12オブジェクト参照カウントを変更するAPI
関数#カンスウ#
さぎょう
incrRefCount
オブジェクトの参照カウント値を1つ増やします.
decrRefCount
オブジェクトの参照カウント値を1つ減らし、オブジェクトの参照カウント値が0に等しい場合、オブジェクトを解放します.
resetRefCount
オブジェクトの参照カウント値を0に設定しますが、オブジェクトは解放されません.この関数は、通常、オブジェクトの参照カウント値を再設定する必要がある場合に使用されます.
オブジェクトのライフサイクル全体は、オブジェクトの作成、オブジェクトの操作、オブジェクトの解放の3つの段階に分けられます.
例として、次のコードは、文字列オブジェクトの作成から解放までのプロセス全体を示します.
//           s ,         1
robj *s = createStringObject(...)

//    s        ...

//     s        ,            0
//      s    
decrRefCount(s)

他の異なるタイプのオブジェクトも同様のプロセスを経験します.