美文网首页
2018-08-04

2018-08-04

作者: Lop | 来源:发表于2018-08-04 16:13 被阅读3次

变量创建之后被保存在zval(变量容器)中。
变量容器由4部分组成,分别是“变量类型”,“变量值”,“refcount”,“is_ref”
refcount称之为“引用计数”,默认是1,表示有一个变量指向该变量容器,会随着赋值而增加。

基本规则

如果一个引用计数增加,它将继续被使用,当然就不再在垃圾中。如果引用计数减少到零,所在变量容器将被清除(free)。就是说,仅仅在引用计数减少到非零值时,才会产生垃圾周期(garbage cycle)。其次,在一个垃圾周期中,通过检查引用计数是否减1,并且检查哪些变量容器的引用次数是零,来发现哪部分是垃圾。

每减少一次引用计数,产生一个垃圾周期

image

重复校验垃圾周期?

可能根(possible root 都是zval变量容器)放入根缓存(root buffer)中,确保每一个zval在根缓存中只出现一次。仅仅在根缓存填满时,才对缓存中的变量容器执行垃圾回收机制

$array[] = ‘one’;//refcount=1
$array[] = &$array;//refcount=2
unset($array);
//$array 的引用计数等于1,导致了内存泄露

相关文章

网友评论

      本文标题:2018-08-04

      本文链接:https://www.haomeiwen.com/subject/qphmvftx.html