内存回收
PHP内存回收
php也是使用了引用计数内存回收机制
typedef struct zval {
// …………
int refcount; // 引用计数
bool is_ref; // 是否有引用
// …………
} robj
- 如果发现一个zval容器中的refcount在增加,说明不是垃圾
- 如果发现一个zval容器中的refcount在减少,如果减到了0,直接当做垃圾回收
- 如果发现一个zval容器中的refcount在减少,并没有减到0,PHP会把该值放到缓冲区,当做有可能是垃圾的怀疑对象
- 当缓冲区达到临界值,PHP会自动调用一个方法取遍历每一个值,如果发现是垃圾就清理
- PHP7标量数据类型(布尔,字符串,整形,浮点型)不再计数,不需要单独分配内存
redis内存回收
redis内存回收采用引用计数技术。
typedef struct redisObject {
// …………
int refcount; // 引用计数
// …………
} robj
redisObject
结构有refcount
字段来标记引用的次数。
- 当创建一个新对象的时候引用计数refcount值初始化为1
- 当对象被一个新程序引用的时候,refcount值会+1
- 当对象不在被一个新程序引用的时候,refcount值会-1
- 当对象refcount值为0的时候, 内存会被释放