当数据进行unset时,引用计数减一后仍然不为0,才会开始垃圾回收。
php7以后,进行了优化,对于一些标量类型,bool、int、字符串,不存在引用导致的回收。
下面来讲垃圾回收(分为垃圾收集器和垃圾回收算法。)
只有在循环引用的情况,才会产生垃圾。所以用到垃圾回收的只有数组和对象。
当数组或对象,unset后,zval数据引用仍大于零将会进入垃圾收集的缓冲区。
当缓冲区的数量到配置值时(默认1万个节点)开始执行垃圾回收算法。
就是将缓冲区内的所有数据,深度遍历,模拟删除。每一个数组内的子值都要删除操作。
模拟删除后,如果引用计数为0了,认为是垃圾。不为0,则还有在使用。