掌握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自定义函数返回多个值
Nov 26 PHP
使用PHP的日期与时间函数技巧
Apr 24 PHP
discuz论坛 用户登录 后台程序代码
Nov 27 PHP
php制作中间带自己定义图片二维码的方法
Jan 27 PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
Jul 18 PHP
ThinkPHP连接数据库及主从数据库的设置教程
Aug 22 PHP
php定义一个参数带有默认值的函数实例分析
Mar 16 PHP
PHP读MYSQL中文乱码的快速解决方法
Oct 01 PHP
php-fpm添加service服务的例子
Apr 27 PHP
实例介绍PHP删除数组中的重复元素
Mar 03 PHP
Laravel如何创建服务器提供者实例代码
Apr 15 PHP
php使用redis的几种常见操作方式和用法示例
Feb 20 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代码(星期六,星期日总和)
2009/11/12 PHP
WordPress中邮件的一些修改和自定义技巧
2015/12/15 PHP
PHP使用redis消息队列发布微博的方法示例
2017/06/22 PHP
JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )
2011/02/25 Javascript
浅析Node在构建超媒体API中的作用
2014/07/30 Javascript
jquery+php实现搜索框自动提示
2014/11/28 Javascript
使用jquery动态加载js文件的方法
2014/12/24 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
基于js实现投票的实例代码
2015/08/04 Javascript
jquery专业的导航菜单特效代码分享
2015/08/29 Javascript
jQuery实现的网页右下角tab样式在线客服效果代码
2015/10/23 Javascript
bootstrap基础知识学习笔记
2016/11/02 Javascript
简单实现js倒计时功能
2017/02/13 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
2018/10/31 Javascript
jquery插件开发模式实例详解
2019/07/20 jQuery
微信小程序后台持续定位功能使用详解
2019/08/23 Javascript
Vue v-text指令简单使用方法示例
2019/09/19 Javascript
python 将print输出的内容保存到txt文件中
2018/07/17 Python
Python二叉树的镜像转换实现方法示例
2019/03/06 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
2019/09/25 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
2020/03/23 Python
pandas使用之宽表变窄表的实现
2020/04/12 Python
Python socket服务常用操作代码实例
2020/06/22 Python
Python如何进行时间处理
2020/08/06 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
2020/11/15 Python
时尚孕妇装:Ingrid & Isabel
2019/05/08 全球购物
大学毕业自我评价
2014/02/02 职场文书
煤矿机修工岗位职责
2014/02/07 职场文书
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
办公室班子四风问题对照检查材料
2014/10/04 职场文书
公务员政审材料
2014/12/23 职场文书
医院科室评语
2015/01/04 职场文书
护士2015年终工作总结
2015/04/29 职场文书
九年级英语教学反思
2016/02/15 职场文书
Nginx虚拟主机的搭建的实现步骤
2022/01/18 Servers
java代码实现空间切割
2022/01/18 Java/Android