经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
[PHP] php5.3之前-php5.3-php7垃圾回收机制的进化
来源:cnblogs  作者:陶士涵  时间:2021/5/6 18:03:05  对本文有异议

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

比如这样的代码:

  1. <?php
  2. $arr=array("tao");
  3. $arr[]=$a;
  4.  
  5. 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'  //改变元素

原文链接:http://www.cnblogs.com/taoshihan/p/14679982.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号