掌握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与paypal整合方法
Nov 28 PHP
基于PHP Web开发MVC框架的Smarty使用说明
Apr 19 PHP
php实现统计邮件大小的方法
Aug 06 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
Dec 25 PHP
php读取纯真ip数据库使用示例
Jan 26 PHP
destoon利用Rewrite规则设置网站安全
Jun 21 PHP
php 魔术方法详解
Nov 11 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
Jun 13 PHP
PHP curl 或 file_get_contents 获取需要授权页面的方法
May 05 PHP
PHP微信支付结果通知与回调策略分析
Jan 10 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
Mar 01 PHP
php + ajax 实现的写入数据库操作简单示例
May 16 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/07/23 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
2016/03/01 PHP
Yii 框架使用数据库(databases)的方法示例
2020/05/19 PHP
PHP强制转化的形式整理
2020/05/22 PHP
goto语法在PHP中的使用教程
2020/09/17 PHP
javascript中的循环语句for语句深入理解
2014/04/04 Javascript
js实现的Easy Tabs选项卡用法实例
2015/09/06 Javascript
javascript实现全角转半角的方法
2016/01/23 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
2016/02/16 Javascript
ES6中如何使用Set和WeakSet
2016/03/10 Javascript
js流动式效果显示当前系统时间
2016/05/16 Javascript
Vue.js组件使用开发实例教程
2016/11/01 Javascript
JS实现json的序列化和反序列化功能示例
2017/06/13 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
微信小程序文章详情页面实现代码
2018/09/10 Javascript
玩转Koa之核心原理分析
2018/12/29 Javascript
基于Vue实现平滑过渡的拖拽排序功能
2019/06/12 Javascript
JavaScript原型继承和原型链原理详解
2020/02/04 Javascript
Python while 循环使用的简单实例
2016/06/08 Python
SVM基本概念及Python实现代码
2017/12/27 Python
Python动刷新抢12306火车票的代码(附源码)
2018/01/24 Python
python自动发邮件库yagmail的示例代码
2018/02/23 Python
Django 中间键和上下文处理器的使用
2019/03/17 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
Python 读取WAV音频文件 画频谱的实例
2020/03/14 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
英国高街品牌:Miss Selfridge(塞尔弗里奇小姐)
2016/09/21 全球购物
意大利灯具购物网站:Lampade.it
2018/10/18 全球购物
世界各地的旅游、观光和活动:Isango!
2019/10/29 全球购物
指针和引用有什么区别
2013/01/13 面试题
国窖1573广告词
2014/03/21 职场文书
老干部工作先进集体事迹材料
2014/05/21 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
税务干部个人整改措施思想汇报
2014/10/10 职场文书
CentOS7环境下MySQL8常用命令小结
2022/06/10 Servers