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的垃圾回收机制有什么不同相关推荐

  1. Centos+Nginx+PHP7.0编译安装(和PHP5.6老版本共存)

    来源:http://blog.csdn.net/liuxinmingcode/article/details/50319145 场景 LNMP  当前版本:PHP 5.5.7  为了体验PHP7的速度 ...

  2. 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作为标准版,没有 ...

  3. kangle安装php7.0_kangle安装fileinfo扩展完善版(PHP7.3.7)

    您的位置:WenRou's Blog >面板> kangle安装fileinfo扩展完善版(PHP7.3.7) kangle安装fileinfo扩展完善版(PHP7.3.7) 1.下载PH ...

  4. ubunntu安装php7.0_在 Ubuntu/Debian 下安装 PHP7.3 教程

    介绍 最近的 PHP 7.3.0 已经在 2018 年12月6日 发布 GA,大家已经可以开始第一时间体验新版本了,这里先放出 PHP7.3 安装的教程以便大家升级. 适用系统: Ubuntu 18. ...

  5. JVM GC 垃圾回收(二)之 判断那些可回收,怎么回收

    1.哪些对象可回收? 可行性分析算法 通过一系列GC Roots(®1)作为起始点,其到对象之间的引用(®2)称为引用链,当对象到GC Roots之间不存在引用链相连, 则此对象是不可用的.如下,Ob ...

  6. 物品回收平台java代码_java垃圾回收

    jvm何时回收一个java对象所占的内存? 当java对象失去引用时,JVM垃圾回收机制会清除他们,回收所占内存空间. java有没有内存泄漏? 无用的内存没有被回收就是内存泄漏. C++内存泄漏:内 ...

  7. java简述垃圾回收原理及算法_Java垃圾回收原理和算法

    ·内存管理 Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放. 对象空间的分配:使用new关键字创建对象即可 对象空间的释放:将对象赋值null即可.垃圾回收器将负责回收所有 ...

  8. 分辨垃圾材质自动分类 支付宝升级垃圾分类AI回收箱

    塑料罐.易拉罐.玻璃瓶分别怎么丢?在今天召开的云栖大会现场,支付宝推出了智能垃圾箱,可对各类不同材质的饮料瓶自动识别.分类丢弃,为行业领先.智能垃圾箱是蚂蚁金服首次在业内推出SKU粒度的垃圾识别技术, ...

  9. 虚拟机:请问我刚刚回收的对象是干垃圾还是湿垃圾?|文末送书

    Java的一大特色就是支持自动垃圾回收(GC),每一个Java开发人员都需要了解虚拟机的垃圾回收机制,本文,就来介绍下如何通过虚拟机的GC日志了解垃圾回收的情况. 最简单的一个GC参数是-XX:+Pr ...

  10. 垃圾回收器如何确定哪些对象要回收---《深入理解java虚拟机》

    2019独角兽企业重金招聘Python工程师标准>>> 垃圾回收器如何确定哪些对象要回收: 引用计数法 很多教科书判断对象是否存活的算法是这样的:给对象添加一个引用计数器,每当有一个 ...

最新文章

  1. 【PAT - 甲级1009】Product of Polynomials (25分)(模拟,细节)
  2. Android系统init进程启动及init.rc全解析
  3. linux源码下载阿帕奇,Ubuntu 12.04下源码安装Apache
  4. 日志 note_深入源码解析日志框架Log4j2(二)
  5. python opencv 直方图均衡_详解python OpenCV学习笔记之直方图均衡化
  6. Struts2中Action的属性接收参数
  7. 一个字符带下滑线的EditText
  8. cvpr2019 文章
  9. 读透《华为数据之道》
  10. 复合型网络拓扑结构图_网络拓扑结构大全和图片(星型、总线型、环型、树型、分布式、网状拓扑结构)...
  11. vue 管理系统顶部tags浏览历史实现
  12. Java -- Ajax异步访问数据库内容
  13. luoguT30208 太极剑(贪心)
  14. 【JAVA笔记】JAVA调用同一个包里的不同类的方法:
  15. 小米、360、萤石等智能摄像头如何选购?需要注意哪些功能信息
  16. 层次状态机-HSM应用解析
  17. Pytorch —— nn.Module类(nn.sequential)
  18. 问题 D: DD_BOND看到的hcy
  19. 一个女人频繁做这些事,真的很爱你
  20. jQuery的常见选择器和筛选器

热门文章

  1. apache开启 gzip 压缩
  2. VMware vSphere4.1看图识HA
  3. 一个有趣的Script脚本工具
  4. 《像计算机科学家一样思考C++》导读
  5. 执行脚本出现以下问题怎么办?
  6. 使用 libevent 和 libev 提高网络应用性能
  7. linux 安全 ***检测 杀毒 rootkit
  8. vmware 12中安装 OpenWRT 及 网络配置
  9. RASPBERRY PI 3 MODEL B 安装使用
  10. VS不能编译指定版本(配置管理错误)