掌握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 相关文章推荐
php5中date()得出的时间为什么不是当前时间的解决方法
Jun 30 PHP
php+javascript的日历控件
Nov 19 PHP
PHP中全局变量global和$GLOBALS[]的区别分析
Aug 06 PHP
如何在PHP中使用正则表达式进行查找替换
Jun 13 PHP
如何在smarty中增加类似foreach的功能自动加载数据
Jun 26 PHP
XAMPP安装与使用方法详细解析
Nov 27 PHP
php生成随机颜色的方法
Nov 13 PHP
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
Sep 30 PHP
PHP实现的DES加密解密实例代码
Apr 06 PHP
PHP中仿制 ecshop验证码实例
Jan 06 PHP
PHP实现通过strace定位故障原因的方法
Apr 29 PHP
PHP高并发和大流量解决方案整理
Mar 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
地球防卫队:陪着奥特曼打小怪兽的人类力量 那些经典队服
2020/03/08 日漫
php环境配置 php5 MySQL5 apache2 phpmyadmin安装与配置图文教程
2007/03/16 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
2018/04/04 PHP
PHP正则判断一个变量是否为正整数的方法
2019/02/27 PHP
清华大学出版的事半功倍系列 javascript全部源代码
2007/05/04 Javascript
js一组验证函数
2008/12/20 Javascript
JQuery toggle使用分析
2009/11/16 Javascript
JavaScript 轻松搞定快捷留言功能 只需一行代码
2010/04/01 Javascript
js动态生成指定行数的表格
2013/07/11 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
初识angular框架后的所思所想
2016/02/19 Javascript
js实现弹窗暗层效果
2017/01/16 Javascript
原生js实现验证码功能
2017/03/16 Javascript
NodeJs模拟登陆正方教务
2017/04/28 NodeJs
vue 将页面公用的头部组件化的方法
2017/12/18 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
js回调函数仿360开机
2019/12/26 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
Python中的魔法方法深入理解
2014/07/09 Python
Python网络编程中urllib2模块的用法总结
2016/07/12 Python
python3安装pip3(install pip3 for python 3.x)
2018/04/03 Python
Python 类的特殊成员解析
2018/06/20 Python
10分钟教你用Python实现微信自动回复功能
2018/11/28 Python
Python实现SQL注入检测插件实例代码
2019/02/02 Python
Python实现K折交叉验证法的方法步骤
2019/07/11 Python
Django-simple-captcha验证码包使用方法详解
2020/11/28 Python
CSS3解决移动页面上点击链接触发色块的问题
2016/06/03 HTML / CSS
HTML5自定义mp3播放器源码
2020/01/06 HTML / CSS
光声世纪笔试题目
2012/08/25 面试题
销售人员中英文自荐信
2013/09/22 职场文书
2014最新离职证明范本
2014/09/12 职场文书
纪念九一八事变演讲稿:忘记意味着背叛
2014/09/14 职场文书
领导干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
公司内部升职自荐信
2015/03/27 职场文书
Python中npy和mat文件的保存与读取
2022/04/24 Python