每一个php变量都存在一个叫”zval“的变量容器 中
一个zval变量容器,有4个参数,除了包含变量的类型和值,还存在is_ref和refcount着两个参数
”is_ref“是个bool值,用来标识这个变量是否属于引用集合(reference set),简单是说就是看这个变量是否被引用,引用就为true,没有被引用就为false
"refcount",用以表示指向这个zval变量容器的变量(也称符号即symbol)个数,就是说一共有多少个变量
变量容器在 ”refcount“变成 0 时就被销毁,当任何关联到某个变量容器的变量离开他的作用域(比如:函数执行结束),或者对变量调用了函数unset()时,”refcount“就会减1
数组容器 数组zval 数组有几个值有几个zval
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
在5.2版本或之前版本,
php会根据refcount值来判断是不是垃圾,如果refcount值为0,php会被当作垃圾释放掉,这种回收机制有缺陷,对于环状引用的变量是无法回收的
在5.3之后版本改进了垃圾回收机制,
如果发现一个 zval容器中refcount在增加,说明不是垃圾;
如果发现一个zval容器中的refcount在减少,如果减到了0,就是直接当垃圾回收;
如果发现一个zval容器中的refcount在减少,并没有减到0,php就会将这个值放在一个缓冲区,当作垃圾的怀疑对象。当这个缓冲区达到了临界值,php会自动调用一个方法unset(),发现垃圾就清理掉
我不放弃,我要赢在明天 ----刘嘉玲《我们来了》