掌握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 翻页 实例代码
Aug 07 PHP
使用php判断浏览器的类型和语言的函数代码
Feb 28 PHP
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
Nov 26 PHP
PHP模板引擎Smarty的缓存使用总结
Apr 24 PHP
php从完整文件路径中分离文件目录和文件名的方法
Mar 13 PHP
如何在旧的PHP系统中使用PHP 5.3之后的库
Dec 02 PHP
PHP中error_reporting函数用法详细介绍
Jun 11 PHP
PHP简单装饰器模式实现与用法示例
Jun 22 PHP
PHP addslashes()函数讲解
Feb 03 PHP
RSA实现JS前端加密与PHP后端解密功能示例
Aug 05 PHP
laravel批量生成假数据的方法
Oct 09 PHP
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
Apr 01 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
投票管理程序
2006/10/09 PHP
php计算函数执行时间的方法
2015/03/20 PHP
PHP中字符与字节的区别及字符串与字节转换示例
2016/10/15 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
JQuery select标签操作代码段
2010/05/16 Javascript
JavaScript中关于indexOf的使用方法与问题小结
2010/08/05 Javascript
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
jquery一句话全选/取消全选
2011/03/01 Javascript
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
一样的table?不一样的table(可编辑状态table)
2012/09/19 Javascript
js 三级关联菜单效果实例
2013/08/13 Javascript
jQuery中delegate和on的用法与区别详细解析
2014/01/26 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
JS实现一个按钮的方法
2015/02/05 Javascript
简介JavaScript中toUpperCase()方法的使用
2015/06/06 Javascript
关于Vue.js一些问题和思考学习笔记(2)
2016/12/02 Javascript
Vue中props的使用详解
2018/06/15 Javascript
JavaScript实现图片放大镜效果
2019/06/27 Javascript
微信小程序 下拉刷新及上拉加载原理解析
2019/11/06 Javascript
js实现简易拖拽的示例
2020/10/26 Javascript
微信小程序实现页面左右滑动
2020/11/16 Javascript
[01:50]《我与DAC》之玩家:iG夺冠时的那面红旗
2018/03/29 DOTA
[05:40]DOTA2荣耀之路6:Wings最后进攻
2018/05/30 DOTA
[37:03]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第二场 12.16
2020/12/18 DOTA
ubuntu17.4下为python和python3装上pip的方法
2018/06/12 Python
在pytorch中为Module和Tensor指定GPU的例子
2019/08/19 Python
python读取tif图片时保留其16bit的编码格式实例
2020/01/13 Python
Python selenium自动化测试模型图解
2020/04/15 Python
如何一键升级Python所有包
2020/11/05 Python
x-ua-compatible content=”IE=7, IE=9″意思理解
2013/07/22 HTML / CSS
美国韩国化妆品和护肤品购物网站:Beautytap
2018/07/29 全球购物
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
师德标兵先进事迹材料
2014/12/19 职场文书
综合测评个人总结
2015/03/03 职场文书
行政处罚告知书
2015/07/01 职场文书
健康教育主题班会
2015/08/14 职场文书