掌握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
php daodb插入、更新与删除数据
Mar 19 PHP
PHP无法访问远程mysql的问题分析及解决
May 16 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
Nov 07 PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
Jun 25 PHP
Win7 64位系统下PHP连接Oracle数据库
Aug 20 PHP
PHP获取当前所在目录位置的方法
Nov 26 PHP
php读取文件内容的方法汇总
Jan 24 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
Jul 22 PHP
php基于Redis消息队列实现的消息推送的方法
Nov 28 PHP
PHP中单例模式的使用场景与使用方法讲解
Mar 18 PHP
PHP实现提高SESSION响应速度的几种方法详解
Aug 09 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 反向排序和随机排序代码
2010/06/30 PHP
实例介绍PHP的Reflection反射机制
2014/08/05 PHP
PHP实现批量检测网站是否能够正常打开的方法
2016/08/23 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
2019/03/07 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
2020/05/29 PHP
经典的解除许多网站无法复制文字的绝招
2006/12/31 Javascript
有效的捕获JavaScript焦点的方法小结
2009/10/08 Javascript
为javascript添加String.Format方法
2020/08/11 Javascript
验证手机号码的JS方法分享
2013/09/10 Javascript
js中的eventType事件及其浏览器支持性介绍
2013/11/29 Javascript
JavaScript编写推箱子游戏
2015/07/07 Javascript
TableSort.js表格排序插件使用方法详解
2017/02/10 Javascript
解决IE7中使用jQuery动态操作name问题
2017/08/28 jQuery
webpack 插件html-webpack-plugin的具体使用
2018/04/09 Javascript
基于rollup的组件库打包体积优化小结
2018/06/18 Javascript
JS使用对象的defineProperty进行变量监控操作示例
2019/02/02 Javascript
微信小程序scroll-view实现滚动到锚点左侧导航栏点餐功能(点击种类,滚动到锚点)
2020/06/11 Javascript
[51:50]完美世界DOTA2联赛 Magma vs GXR 第一场 11.07
2020/11/10 DOTA
vc6编写python扩展的方法分享
2014/01/17 Python
python爬取m3u8连接的视频
2018/02/28 Python
对Python中gensim库word2vec的使用详解
2018/05/08 Python
Python qqbot 实现qq机器人的示例代码
2019/07/11 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
使用Python制作一个打字训练小工具
2019/10/01 Python
基于Python中isfile函数和isdir函数使用详解
2019/11/29 Python
python opencv图片编码为h264文件的实例
2019/12/12 Python
Python3 虚拟开发环境搭建过程(图文详解)
2020/01/06 Python
Pytorch 实现focal_loss 多类别和二分类示例
2020/01/14 Python
python 对xml解析的示例
2021/02/27 Python
英国领先的品牌珠宝和配件供应商:Acotis Jewellery
2018/03/07 全球购物
馥绿德雅美国官方网站:Rene Furterer头皮护理专家
2019/05/01 全球购物
linux面试题参考答案(6)
2014/08/29 面试题
四下基层实施方案
2014/03/28 职场文书
好学生评语大全
2014/05/05 职场文书
2014公安机关纪律作风整顿思想汇报
2014/09/13 职场文书