掌握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下实现一个阿拉伯数字转中文数字的函数
Jul 10 PHP
PHPMailer邮件类利用smtp.163.com发送邮件方法
Sep 11 PHP
PHP stream_context_create()作用和用法分析
Mar 29 PHP
PHP 第二节 数据类型之数值型
Apr 28 PHP
基于php在各种web服务器的运行模式详解
Jun 03 PHP
在php和MySql中计算时间差的方法详解
Mar 27 PHP
PHP的swoole扩展安装方法详细教程
May 18 PHP
laravel5创建service provider和facade的方法详解
Jul 26 PHP
PHP用PDO如何封装简单易用的DB类详解
Jul 30 PHP
利用laravel+ajax实现文件上传功能方法示例
Aug 13 PHP
php查看一个变量的占用内存的实例代码
Mar 29 PHP
PHP获取真实IP及IP模拟方法解析
Nov 24 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+JS+rsa数据加密传输实现代码
2011/03/23 PHP
析构函数与php的垃圾回收机制详解
2013/10/28 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
破除网页鼠标右键被禁用的绝招大全
2006/12/27 Javascript
JavaScript中的console.profile()函数详细介绍
2014/12/29 Javascript
浅谈JavaScript中Date(日期对象),Math对象
2015/02/05 Javascript
Jquery promise实现一张一张加载图片
2015/11/13 Javascript
js判断登陆用户名及密码是否为空的简单实例
2016/05/16 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
2016/06/24 Javascript
AngularJs 国际化(I18n/L10n)详解
2016/09/01 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
详解Vue取消eslint语法限制
2018/08/04 Javascript
利用原生的JavaScript实现简单拼图游戏
2018/11/18 Javascript
vue 开发企业微信整合案例分析
2019/12/02 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
2020/07/23 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
Vue3+elementui plus创建项目的方法
2020/12/01 Vue.js
通过滑动翻页效果实现和移动端click事件问题
2021/01/26 Javascript
[02:39]我与DAC之Newbee.Moogy:从论坛到TI
2018/03/26 DOTA
跟老齐学Python之有容乃大的list(1)
2014/09/14 Python
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
Python爬虫获取豆瓣电影并写入excel
2020/07/31 Python
Python爬虫中Selenium实现文件上传
2020/12/04 Python
Python tkinter之Bind(绑定事件)的使用示例
2021/02/05 Python
能否解释一下XSS cookie盗窃是什么意思
2012/06/02 面试题
小学生家长评语集锦
2014/01/30 职场文书
一夜的工作教学反思
2014/02/08 职场文书
公司接待方案
2014/03/08 职场文书
理财投资建议书
2014/03/12 职场文书
文明礼仪演讲稿
2014/05/12 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
2014年学生会个人工作总结
2014/11/07 职场文书
医院党建工作总结2015
2015/05/26 职场文书
kubernetes集群搭建Zabbix监控平台的详细过程
2022/07/07 Servers