• [PHP] php5.3之前-php5.3-php7垃圾回收机制的进化


    php5.3之前的版本 , 只有引用计数 , 如果遇到循环引用的情况  , 会出现内存泄露

    比如这样的代码:

    <?php
    $arr=array("tao");
    $arr[]=$a;
    
    unset($arr)
    

    虽然unset了$arr , 但是内存并不能回收 , 因为有引用自身这样的行为

      

    php5.3 之后的版本 , 有引用计数和同步周期回收算法

    在引用计数的基础上 , 增加了同步回收 , 把计数减-1 大于0的变量 , 塞入了root buffer这样的根缓冲池 , 满10000后 , 对池里的变量进行回收操作 , 解决了上面的循环引用问题

    php7之后的版本 , 优化了引用计数部分

    简单类型:bool(true/false), null, long,double ,值直接存储在zval中 , 没有引用计数

    内部增加了一个引用类型 ,  变量为对象类型 , 资源类型 , 引用类型时 , 会使用引用计数

    字符串类型 , 区分临时字符串 , 内部字符串 , 已知字符串 , 内部字串和已知字串,都会存在于php运行的整个周期,不涉及垃圾回收问题 , 没有引用计数 , 临时字符串有引用计数

    数组分为不可变数组和可变数组 ; 不可变数组引用计数初始为2 , 往后会+1  ;  可变数组初始为1 , 往后会+1

    不可变数组:

    元素是不可变元素的就是不可变数组 , 比如string, integer, float等

    $arr=['tao','shihan']

    可变数组:

    1. 动态生成数组

    2. 对不可变数组做任何改变(增减元素,改变元素值)

    $arr=range(1,2)

    $a = ['y', 'x']; $a[0]='tao'  //改变元素

    开源作品

    GO-FLY,一套可私有化部署的免费开源客服系统,安装过程不超过五分钟(超过你打我 !),基于Golang开发,二进制文件可直接使用无需搭开发环境,下载zip解压即可,仅依赖MySQL数据库,是一个开箱即用的网页在线客服系统,致力于帮助广大开发者/中小站长快速整合私有客服功能
    github地址:go-fly
    官网地址:https://gofly.sopans.com

    赞赏作者

    微信交流

  • 相关阅读:
    过程作为黑箱抽象——《计算机程序的构造和解释》
    过程与它们所产生的计算——《计算机程序的构造和解释》
    重构手法(四)之在对象之间搬移特性
    重构手法(三)之简化条件表达式
    重构手法(二)之简化函数调用
    重构手法(一)之重新组织函数
    代码的坏味道
    泛型算法(二十三)之排列算法
    泛型算法(二十二)之集合操作算法
    泛型算法(二十一)之比较算法
  • 原文地址:https://www.cnblogs.com/taoshihan/p/14679982.html
Copyright © 2020-2023  润新知