php7比php5垃圾回收,PHP5和PHP7的垃圾回收机制有什么不同
PHP5和PHP7的垃圾回收机制有什么不同
博主:yangxuesong5555 发表时间:2018-03-01 20:57:28 浏览量:34
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 之间;*
php7比php5垃圾回收,PHP5和PHP7的垃圾回收机制有什么不同相关推荐
- Centos+Nginx+PHP7.0编译安装(和PHP5.6老版本共存)
来源:http://blog.csdn.net/liuxinmingcode/article/details/50319145 场景 LNMP 当前版本:PHP 5.5.7 为了体验PHP7的速度 ...
- ubuntu16.04安装php5出现Package php5 have no installation candidate,解决方法
Ubuntu 16.04 comes with PHP7 as the standard, so there are no PHP5 packages ubuntu16.04将php7作为标准版,没有 ...
- kangle安装php7.0_kangle安装fileinfo扩展完善版(PHP7.3.7)
您的位置:WenRou's Blog >面板> kangle安装fileinfo扩展完善版(PHP7.3.7) kangle安装fileinfo扩展完善版(PHP7.3.7) 1.下载PH ...
- ubunntu安装php7.0_在 Ubuntu/Debian 下安装 PHP7.3 教程
介绍 最近的 PHP 7.3.0 已经在 2018 年12月6日 发布 GA,大家已经可以开始第一时间体验新版本了,这里先放出 PHP7.3 安装的教程以便大家升级. 适用系统: Ubuntu 18. ...
- JVM GC 垃圾回收(二)之 判断那些可回收,怎么回收
1.哪些对象可回收? 可行性分析算法 通过一系列GC Roots(®1)作为起始点,其到对象之间的引用(®2)称为引用链,当对象到GC Roots之间不存在引用链相连, 则此对象是不可用的.如下,Ob ...
- 物品回收平台java代码_java垃圾回收
jvm何时回收一个java对象所占的内存? 当java对象失去引用时,JVM垃圾回收机制会清除他们,回收所占内存空间. java有没有内存泄漏? 无用的内存没有被回收就是内存泄漏. C++内存泄漏:内 ...
- java简述垃圾回收原理及算法_Java垃圾回收原理和算法
·内存管理 Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放. 对象空间的分配:使用new关键字创建对象即可 对象空间的释放:将对象赋值null即可.垃圾回收器将负责回收所有 ...
- 分辨垃圾材质自动分类 支付宝升级垃圾分类AI回收箱
塑料罐.易拉罐.玻璃瓶分别怎么丢?在今天召开的云栖大会现场,支付宝推出了智能垃圾箱,可对各类不同材质的饮料瓶自动识别.分类丢弃,为行业领先.智能垃圾箱是蚂蚁金服首次在业内推出SKU粒度的垃圾识别技术, ...
- 虚拟机:请问我刚刚回收的对象是干垃圾还是湿垃圾?|文末送书
Java的一大特色就是支持自动垃圾回收(GC),每一个Java开发人员都需要了解虚拟机的垃圾回收机制,本文,就来介绍下如何通过虚拟机的GC日志了解垃圾回收的情况. 最简单的一个GC参数是-XX:+Pr ...
- 垃圾回收器如何确定哪些对象要回收---《深入理解java虚拟机》
2019独角兽企业重金招聘Python工程师标准>>> 垃圾回收器如何确定哪些对象要回收: 引用计数法 很多教科书判断对象是否存活的算法是这样的:给对象添加一个引用计数器,每当有一个 ...
最新文章
- 【PAT - 甲级1009】Product of Polynomials (25分)(模拟,细节)
- Android系统init进程启动及init.rc全解析
- linux源码下载阿帕奇,Ubuntu 12.04下源码安装Apache
- 日志 note_深入源码解析日志框架Log4j2(二)
- python opencv 直方图均衡_详解python OpenCV学习笔记之直方图均衡化
- Struts2中Action的属性接收参数
- 一个字符带下滑线的EditText
- cvpr2019 文章
- 读透《华为数据之道》
- 复合型网络拓扑结构图_网络拓扑结构大全和图片(星型、总线型、环型、树型、分布式、网状拓扑结构)...
- vue 管理系统顶部tags浏览历史实现
- Java -- Ajax异步访问数据库内容
- luoguT30208 太极剑(贪心)
- 【JAVA笔记】JAVA调用同一个包里的不同类的方法:
- 小米、360、萤石等智能摄像头如何选购?需要注意哪些功能信息
- 层次状态机-HSM应用解析
- Pytorch —— nn.Module类(nn.sequential)
- 问题 D: DD_BOND看到的hcy
- 一个女人频繁做这些事,真的很爱你
- jQuery的常见选择器和筛选器