php5和php7的垃圾回收区别PHP5和PHP7的垃圾回收机制都属于引用计数,但是在复杂数据类型的算法处理上:PHP7新增了zval的实现。最基本的变化是*zval需要的内存不再单独从堆中分配,引用计数不再自己存储。字符串、数组、对象等复杂数据类型的引用计数是自己存储的。这种实现方式有以下优点:1、简单数据类型不需要单独分配内存,也不需要统计;2.不会重复计算。在对象中,只有对象本身存储的计数才有效;3.由于count现在是由value本身存储的,所以也可以和非zval结构的数据共享,比如zval和hashtablekey之间。什么是引用计数?由于PHP是用C写的,所以在C中有一种叫做结构体的东西,我们的PHP变量在C中就是这样存储的。每个PHP变量都存在一个叫做zval的容器中,zval容器中除了包含变量名和value,还包括两个字节的附加信息: 一个叫做'is_ref',是一个布尔值,用来表示这个变量是否属于引用集,通过这个字节,我们可以在PHP中区分普通变量和引用变量.● 第二个多出来的字节是'refcount',用来表示指向这个容器的变量个数。PHP5和PHP7php5.*引用计数比较变量赋值等操作的引用计数如图所示。倒数第二步会形成循环引用,unset操作后会产生垃圾。PHP7的计数放在一个特定的值中,zval没有写时复制(separate-on-write)。并且PHP7有一个特殊的zend_reference用来表示引用。
