教程集 www.jiaochengji.com
教程集 >  脚本编程  >  php  >  正文 php5和php7垃圾回收上的区别是什么?

php5和php7垃圾回收上的区别是什么?

发布时间:2020-07-12   编辑:jiaochengji.com
教程集为您提供php5和php7垃圾回收上的区别是什么?等资源,欢迎您收藏本站,我们将为您提供最新的php5和php7垃圾回收上的区别是什么?资源

php5和php7垃圾回收上的区别

PHP5和PHP7的垃圾回收机制都属于引用计数,但是在复杂数据类型的算法处理上:PHP7中zval有了新的实现方式。

最基础的变化就是 *zval 需要的内存不再是单独从堆上分配,不再自己存储引用计数。复杂数据类型(比如字符串、数组和对象)的引用计数由其自身来存储。

这种实现方式有以下好处:

1、简单数据类型不需要单独分配内存,也不需要计数;

2、不会再有两次计数的情况。在对象中,只有对象自身存储的计数是有效的;

3、由于现在计数由数值自身存储,所以也就可以和非 zval 结构的数据共享,比如 zval 和 hashtable key 之间。

什么叫做引用计数?

由于PHP是用C来写的,C里面有一种东西叫做结构体,我们PHP的变量在C中就是用这种方式存储的。

每个PHP的变量都存在于一个叫做zval的容器中,一个zval容器,除了包含变量名和值,还包括两个字节的额外信息:

● 一个叫做'is_ref',是个布尔值,用来表示这个变量是否属于引用集合,通过这个字节,我们php才能把普通变量和引用变量区分开来。

● 第二个额外字节就是'refcount',用来表示指向这个容器的变量的个数。

PHP5 与 PHP7 引用计数的对比

php 5.* 变量赋值等操作引用计数如图所示,在倒数第二步,会形成一个循环引用,并且在 unset 操作之后,会产生垃圾。

\"1571470962691629.png\"

PHP 7 的计数放到了具体的 value 中,zval 不存在写时复制(写时分离)。

并且 PHP 7 的有一个专门的 zend_reference 用来表示引用。

\"1571470987432602.png\"

以上就是php5和php7垃圾回收上的区别是什么?的详细内容,更多请关注教程集其它相关文章!

  • 本文原创发布教程集,转载请注明出处,感谢您的尊重!
  • 您可能感兴趣的文章:
    php7和php5区别是什么
    PHP是如何做垃圾回收的(图文)
    php5和php7垃圾回收上的区别是什么?
    PHP7和PHP5在安全上的区别(实例)
    如何利用Python进行垃圾分类
    php5与php7的区别是什么?
    php7与php5的区别有哪些?
    java内存释放的深入理解
    java中HotSpot算法及垃圾收集器简介
    php垃圾回收机制解析

    [关闭]
    ~ ~