掌握PHP垃圾回收机制详解


Posted in PHP onMarch 13, 2019

php的垃圾回收机制可以简单总结为 引用计数 写时复制 COW机制,

本文主要和大家分享掌握php垃圾回收机制的知识,希望能帮助到大家。

引用计数基本知识

官网的解答如下 每个php变量存在一个叫”zval”的变量容器中一个zval变量容器,除了包含变量的类型和值 ,还包括两个字节的额外信息 is_ref 和 refcount is_ref 是个bool值,用来标识这个变量是否是属于引用集合(reference set)。通过这个字节,php引擎才能把普通变量和引用变量区分开来 refcount 用以表示指向这个zval变量容器的变量个数 PHP5 中的引用计数在PHP5中,zval 的内存是单独从堆(heap)中分配的(有少数例外情况),PHP 需要知道哪些 zval 是正在使用的,哪些是需要释放的。所以这就需要用到引用计数:zval 中 refcount__gc 的值用于保存 zval 本身被引用的次数,比如 b = 12语句中,12 被两个变量引用,所以它的引用计数就是 2。如果引用计数变成 0,就意味着这个变量已经没有用了,内存也就可以释放了。

如下:

<?php 
//php zval变量容器
$a = 1;
$b = 1;
$c = &$a;
$d = $b;
$e = range(0, 3); 
xdebug_debug_zval('a');
 xdebug_debug_zval('b'); 
xdebug_debug_zval('c');
 xdebug_debug_zval('d');
 xdebug_debug_zval('e'); >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 结果如下 
a:(refcount=2, is_ref=1),int 1b:(refcount=2, is_ref=0),int 1c:(refcount=2, is_ref=1),int 1d:(refcount=2, is_ref=0),int 1e:(refcount=1, is_ref=0), array (size=4) 0 => (refcount=1, is_ref=0),int 0 1 => (refcount=1, is_ref=0),int 1 2 => (refcount=1, is_ref=0),int 2 3 => (refcount=1, is_ref=0),int 3

每一个变量都记了自己的数PHP7 中的 zval在 PHP7 中 zval 有了新的实现方式。最基础的变化就是 zval 需要的内存不再是单独从堆上分配,不再自己存储引用计数。复杂数据类型(比如字符串、数组和对象)的引用计数由其自身来存储。这种实现方式有以下好处:简单数据类型不需要单独分配内存,也不需要计数不会再有两次计数的情况,在对象中,只有对象自身存储的计数是有效的由于现在计数由数值自身存储,所以也就可以和非 zval 结构的数据共享,比如 zval 和 hashtable key 之间间接访问需要的指针数减少了

<?php 
//php zval变量容器
$a = 1;
$b = 1;
$c = &$a;
$d = $b;
$e = range(0, 3); 
xdebug_debug_zval('a');
 xdebug_debug_zval('b'); 
xdebug_debug_zval('c');
 xdebug_debug_zval('d'); 
xdebug_debug_zval('e'); >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 结果如下 a:(refcount=2, is_ref=1)int 1b:(refcount=0, is_ref=0)int 1c:(refcount=2, is_ref=1)int 1d:(refcount=0, is_ref=0)int 1e:(refcount=1, is_ref=0)array (size=4) 0 => (refcount=0, is_ref=0)int 0 1 => (refcount=0, is_ref=0)int 1 2 => (refcount=0, is_ref=0)int 2 3 => (refcount=0, is_ref=0)int 3

普通变量不再记自己的数,数组这样的复杂类型记自己的数什么是垃圾只有在准则3下,GC才会把zval收集起来,然后通过新的算法来判断此zval是否为垃圾。那么如何判断这么一个变量是否为真正的垃圾呢?简单的说,就是对此zval中的每个元素进行一次refcount减1操作,操作完成之后,如果zval的refcount=0,那么这个zval就是一个垃圾如果一个zval的refcount增加,那么此zval还在使用,不属于垃圾如果一个zval的refcount减少到0, 那么zval可以被释放掉,不属于垃圾如果一个zval的refcount减少之后大于0,那么此zval还不能被释放,此zval可能成为一个垃圾

以上所述是小编给大家介绍的PHP垃圾回收机制详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
利用递归把多维数组转为一维数组的函数
Oct 09 PHP
Ajax PHP分页演示
Jan 02 PHP
一贴学会PHP 新手入门教程
Aug 03 PHP
PHP 单引号与双引号的区别
Nov 24 PHP
PHP反转字符串函数strrev()函数的用法
Feb 04 PHP
php中如何使对象可以像数组一样进行foreach循环
Aug 09 PHP
PHP使用ODBC连接数据库的方法
Jul 18 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
Feb 23 PHP
PHP简单获取随机数的常用方法小结
Jun 07 PHP
PHP实现数组的笛卡尔积运算示例
Dec 15 PHP
php工具型代码之印章抠图
Jul 18 PHP
laravel请求参数校验方法
Oct 10 PHP
浅谈php的TS和NTS的区别
Mar 13 #PHP
浅谈PHP各环境下的伪静态配置
Mar 13 #PHP
Laravel框架实现的使用smtp发送邮件功能示例
Mar 12 #PHP
Laravel事件监听器用法实例分析
Mar 12 #PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
Mar 12 #PHP
PHP DB 数据库连接类定义与用法示例
Mar 11 #PHP
PHP实现的杨辉三角求解算法分析
Mar 11 #PHP
You might like
PHP编码规范-php coding standard
2007/03/16 PHP
PHP的变量总结 新手推荐
2011/04/18 PHP
将php数组输出html表格的方法
2014/02/24 PHP
PHP统计数值数组中出现频率最多的10个数字的方法
2015/04/20 PHP
php检测文本的编码
2015/07/26 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
2017/02/10 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
laravel migrate初学常见错误的解决方法
2017/10/11 PHP
判断多个input type=file是否有已经选择好文件的代码
2012/05/23 Javascript
JS判断元素为数字的奇异写法分享
2012/08/01 Javascript
利用百度地图JSAPI生成h7n9禽流感分布图实现代码
2013/04/15 Javascript
原生js和css实现图片轮播效果
2017/02/07 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
vue.js 添加 fastclick的支持方法
2018/08/28 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
2019/05/22 Javascript
webpack自动打包和热更新的实现方法
2019/06/24 Javascript
JavaScript中的执行环境和作用域链
2020/09/04 Javascript
[04:52]DOTA2亚洲邀请赛附加赛 TOP10精彩集锦
2015/01/29 DOTA
[01:57]2016完美“圣”典风云人物:国士无双专访
2016/12/04 DOTA
朴素贝叶斯算法的python实现方法
2014/11/18 Python
Python中字典映射类型的学习教程
2015/08/20 Python
Python+Wordpress制作小说站
2017/04/14 Python
浅谈Python中的bs4基础
2018/10/21 Python
python实现dijkstra最短路由算法
2019/01/17 Python
django创建超级用户过程解析
2019/09/18 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
2020/04/10 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
为什么python比较流行
2020/06/19 Python
美国隐形眼镜零售商:LensPure
2019/03/10 全球购物
J2EE的优越性主要表现在哪些方面
2016/03/28 面试题
党员四风自我剖析材料思想汇报
2014/09/13 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
五好文明家庭事迹材料
2014/12/20 职场文书
2015年父亲节寄语
2015/03/23 职场文书
Python机器学习之逻辑回归
2021/05/11 Python