PHP的垃圾回收机制

每一个变量对应一个zval数据结构(zend value 的简写),在该结构内还有一个val结构体,该结构体内有一个引用计数(php7而言,对于php5,这个引用计数是保存在zval结构中的),标识该对象的引用数,当对象的引用计数为0时代表这个对象可被回收。

对象的refcount减少的时机:修改变量、函数返回(释放局部变量)、unset变量

对于数组和对象而言,可能存在变量中的成员引用变量本身的情况,也就是循环引用,这样会造成这个变量永远不会被内存回收,而成为垃圾。PHP里对于这种情况给出了垃圾回收机制:

如果数组、对象的引用计数减少而且不为零,则认为他们可能是垃圾,把他们放到垃圾收集器里。等垃圾收集器到了一定的数量之后,进行垃圾处理:对所有可能的垃圾refcount减1,如果为1,说明是垃圾,则进行内存回收;如果不为1,说明还有其他变量在使用,refcount重新加1;

这种对象复用以及垃圾回收机制在其他语言中也有体现:redis中也使用了引用计数表示每个对象的引用数量。