PHP5和7中对垃圾回收机制的理解一样吗
Admin 2022-07-30 群英技术资讯 738 次浏览
php5和php7的垃圾回收机制都是利用引用计数
我们先来看看什么叫做引用计数:
由于PHP是用C来写的,C里面有一种东西叫做结构体,我们PHP的变量在C中就是用这种方式存储的
每个PHP的变量都存在于一个叫做zval的容器中,一个zval容器,除了包含变量名和值,还包括两个字节的额外信息,一个叫做'is_ref',是个布尔值,用来表示这个变量是否属于引用集合,通过这个字节,我们php才能把普通变量和引用变量区分开来.第二个额外字节就是'refcount',用来表示指向这个容器的变量的个数
我们在PHP中定义一个变量
$name='看看';
我们现在可以使用xdebug_debug_zval()函数来获得函数内变量的相关信息
xdebug_debug_zval('name'); //输出 name:(refcount=1,is_ref=0)='new String' 现在我们把$name赋值给$money $money = $name;
再来查看一下:
xdebug_debug_zval('name'); //输出 name:(refcount=2,is_ref=0)='new String'
这时候我们会看到refcount的字段的值增加了1,代表现有两个变量指向了相同的一个名字叫做name的aval容器
根据引用计数的规则,当这个refcount=0的时候,php就会把这个容器当做垃圾进行回收.
同样我们执行
unset($name); //一样也会把name容器的引用计数设置为0
以上的结论只是针对标量类型的,下面我们来看看负责类型的
数组:
$person=['name'=>'请欢','age'=>19]; var_dump(xdebug_debug_zval('person')); 在PHP5输出: person: (refcount=1, is_ref=0), array (size=2) 'name' => (refcount=1, is_ref=0),string '看看' (length=6) 'age' => (refcount=1, is_ref=0),int 19
在PHP7中输出:
person: (refcount=2, is_ref=0) array (size=2) 'name' => (refcount=1, is_ref=0)string '看看' (length=6) 'age' => (refcount=0, is_ref=0)int 19
由此可见,对于复杂的数据类型,PHP5和PHP7的引用计数算法是不一样的
我们来试试循环引用的情况
在上面代码的基础上,添加一行代码
$person['hello'] = $person['name']
在PHP7中输出:
person: (refcount=1, is_ref=0) array (size=3) 'name' => (refcount=3, is_ref=0)string '看看' (length=6) 'age' => (refcount=0, is_ref=0)int 19 'hello' => (refcount=3, is_ref=0)string '看看' (length=6)
在PHP5中输出:
person: (refcount=1, is_ref=0), array (size=3) 'name' => (refcount=2, is_ref=0),string '看看' (length=6) 'age' => (refcount=1, is_ref=0),int 19 'hello' => (refcount=2, is_ref=0),string '看看' (length=6)
小总结:
PHP5和PHP7的垃圾回收机制都属于引用计数,但是在复杂数据类型的算法处理上:
在 PHP7 中 zval 有了新的实现方式。最基础的变化就是 *zval 需要的内存不再是单独从堆上分配,不再自己存储引用计数。复杂数据类型(比如字符串、数组和对象)的引用计数由其自身来存储。这种实现方式有以下好处:*
*简单数据类型不需要单独分配内存,也不需要计数;*
*不会再有两次计数的情况。在对象中,只有对象自身存储的计数是有效的;*
*由于现在计数由数值自身存储,所以也就可以和非 zval 结构的数据共享,比如 zval 和 hashtable key 之间;*
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
php返回json数据:1、PHP中的json_encode()用于JSON编码变量,如果功能成功返回JSON数据,则返回FALSE。2、string json_encode ( $value [, $options = 0 ] )。
你清楚php如何实现异步执行吗?其实利用四种方式来处理就行,如果你对这方面感兴趣的话,下文有详解方法和实例,内容详细,逻辑清晰,有需要的朋友可以参考,希望大家阅读完这篇文章后能有所收获,那么下面就一起来了解一下吧。
在本篇内容中我们给大家分享了关于stripos函数知识点实例内容,有需要的朋友们跟着学习下。
变量转成整数类型。语法:intintval(mixedvar,int[base]);返回值:整数函数种类:PHP系统功能 内容说明本函数可将变量转成整数类型。可省略的参数base是转换的基底,默认值为10。转换的变量var可以为数组或类之外的任何类型变量。intval()使用不当的安全漏洞分析intval函数有个特性:”直到遇上数字或正负符号才开始做转换,再
本篇文章给大家介绍一下php7实现垃圾回收机制的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008