变量创建之后被保存在zval(变量容器)中。
变量容器由4部分组成,分别是“变量类型”,“变量值”,“refcount”,“is_ref”
refcount称之为“引用计数”,默认是1,表示有一个变量指向该变量容器,会随着赋值而增加。
基本规则
image如果一个引用计数增加,它将继续被使用,当然就不再在垃圾中。如果引用计数减少到零,所在变量容器将被清除(free)。就是说,仅仅在引用计数减少到非零值时,才会产生垃圾周期(garbage cycle)。其次,在一个垃圾周期中,通过检查引用计数是否减1,并且检查哪些变量容器的引用次数是零,来发现哪部分是垃圾。
每减少一次引用计数,产生一个垃圾周期
重复校验垃圾周期?
将可能根(possible root 都是zval变量容器)放入根缓存(root buffer)中,确保每一个zval在根缓存中只出现一次。仅仅在根缓存填满时,才对缓存中的变量容器执行垃圾回收机制
$array[] = ‘one’;//refcount=1
$array[] = &$array;//refcount=2
unset($array);
//$array 的引用计数等于1,导致了内存泄露
网友评论