每一个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(),发现垃圾就清理掉

 

我不放弃,我要赢在明天     ----刘嘉玲《我们来了》

posted on 2019-04-26 16:56  潜水姑娘柠檬心♥  阅读(98)  评论(0编辑  收藏  举报