PHP内存管理机制与垃圾回收机制( 二 )


1.在5.2版本或之前版本,PHP会根据refcount值来判断是不是垃圾
如果refcount值为0,PHP会当做垃圾释放掉
这种回收机制有缺陷,对于环状引用的变量无法回收
环状引用:
$attr = array("hello");$attr[]= &$attr;xdebug_debug_zval('attr');echo PHP_EOL;输出:
attr:(refcount=2, is_ref=1),array (size=2) 0 => (refcount=1, is_ref=0),string 'hello' (length=5) 1 => (refcount=2, is_ref=1), &array2.在5.3之后版本改进了垃圾回收机制
如果发现一个zval容器中的refcount在增加,说明不是垃圾
如果发现一个zval容器中的refcount在减少,如果减到了0,直接当做垃圾回收
如果发现一个zval容器中的refcount在减少,并没有减到0,PHP会把该值放到缓冲区,当做有可能是垃圾的怀疑对象
当缓冲区达到临界值,PHP会自动调用一个方法取遍历每一个值,如果发现是垃圾就清理




推荐阅读