掌握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 相关文章推荐
php的正则处理函数总结分析
Jun 20 PHP
PHP读取XML值的代码(推荐)
Jan 01 PHP
PHP持久连接mysql_pconnect()函数使用介绍
Feb 05 PHP
解决Codeigniter不能上传rar和zip压缩包问题
Mar 07 PHP
PHP创建word文档的方法(平台无关)
Mar 29 PHP
php打包压缩文件之ZipArchive方法用法分析
Apr 30 PHP
PHP设计模式之工厂模式与单例模式
Sep 28 PHP
CI框架表单验证实例详解
Nov 21 PHP
php使用curl获取header检测开启GZip压缩的方法
Aug 15 PHP
PHP字符串与数组处理函数用法小结
Jan 07 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
Dec 29 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变量作用域的深入解析
2013/06/03 PHP
PHP SESSION的增加、删除、修改、查看操作
2015/03/20 PHP
PHP查找与搜索数组元素方法总结
2015/06/12 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
2016/09/23 PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
2019/03/11 PHP
JavaScript 检测浏览器和操作系统的脚本
2008/12/26 Javascript
BootStrap table使用方法分析
2016/11/08 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
2016/12/01 Javascript
100行代码理解和分析vue2.0响应式架构
2017/03/09 Javascript
angularjs的select使用及默认选中设置
2017/04/08 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
2017/08/08 jQuery
浅析为什么a=&quot;abc&quot; 不等于 a=new String(&quot;abc&quot;)
2017/10/25 Javascript
vue加载自定义的js文件方法
2018/03/13 Javascript
vue实现键盘输入支付密码功能
2018/08/18 Javascript
vue安装和使用scss及sass与scss的区别详解
2018/10/15 Javascript
详解关于element级联选择器数据回显问题
2019/02/20 Javascript
Vue CL3 配置路径别名详解
2019/05/30 Javascript
Vue 使用Props属性实现父子组件的动态传值详解
2019/11/13 Javascript
vue prop属性传值与传引用示例
2019/11/13 Javascript
序列化模块json代码实例详解
2020/03/03 Javascript
python函数返回多个值的示例方法
2013/12/04 Python
Python中特殊函数集锦
2015/07/27 Python
python flask 多对多表查询功能
2017/06/25 Python
Python实现的微信支付方式总结【三种方式】
2019/04/13 Python
python对象与json相互转换的方法
2019/05/07 Python
计算机二级python学习教程(3) python语言基本数据类型
2019/05/16 Python
Python底层封装实现方法详解
2020/01/22 Python
Python unittest生成测试报告过程解析
2020/09/08 Python
python爬虫爬取网页数据并解析数据
2020/09/18 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
数组越界问题
2015/10/21 面试题
高一学生期末评语
2014/04/25 职场文书
启动仪式策划方案
2014/06/14 职场文书
私人委托书格式
2014/09/10 职场文书
党员干部学习三严三实心得体会
2016/01/05 职场文书
2016年感恩母亲节活动总结
2016/04/01 职场文书