您的位置:首页 > 编程语言 > PHP开发

PHP 垃圾回收机制

2018-03-08 11:07 429 查看

引用计数

1) PHP的垃圾回收周期是在引用计数减少到非零值时产生的。因此首先需要了解引用计数的知识。2) 每个php变量存在一个叫"zval"的变量容器中。一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息。第一个是"is_ref",是个bool值,用来标识这个变量是否是属于引用集合(reference set)。3) 第二个额外字节是"refcount",用以表示指向这个zval变量容器的变量(也称符号即symbol)个数。5) 把一个变量赋值给另一变量将增加引用次数(refcount)。当任何关联到某个变量容器的变量离开它的作用域(比如:函数执行结束),或者对变量调用了函数 unset()时,”refcount“就会减1。4) 测试代码示例:
$str = 'Hello World!';
xdebug_debug_zval('str');
$str1 = $str2 = $str;
xdebug_debug_zval('str');
unset($str1);
xdebug_debug_zval('str');以上示例输出
str:
(refcount=1, is_ref=0),string 'Hello World!' (length=12)
str:
(refcount=3, is_ref=0),string 'Hello World!' (length=12)
str:
(refcount=2, is_ref=0),string 'Hello World!' (length=12)

回收周期

1) 在引用计数减少到非零值时,才会产生垃圾周期(garbage cycle)。其次,在一个垃圾周期中,通过检查引用计数是否减1,并且检查哪些变量容器的引用次数是零,来发现哪部分是垃圾。2) PHP垃圾回收的算法是模拟删除、模拟恢复、真的删除,每个动作都使用深搜遍历。3) PHP回收机制的配置:zend.enable_gc。也能通过分别调用gc_enable()gc_disable()函数来打开和关闭垃圾回收机制,调用gc_disable()函数释放内存之前,先调用gc_collect_cycles()函数可能比较明智。4) 对性能影响的领域:第一个是内存占用空间的节省,另一个是垃圾回收机制执行内存清理时的执行时间增加5) 在PHP执行中,一旦根缓冲区满了或者调用gc_collect_cycles() 函数时,就会执行垃圾回收。参考资料:http://php.net/manual/zh/features.gc.phpXdebug资源:https://xdebug.org/download.php
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: