掌握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 相关文章推荐
多重?l件?合查?(一)
Oct 09 PHP
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
Apr 07 PHP
PHP面向对象学习笔记之一 基础概念
Oct 06 PHP
PHP基础知识介绍
Sep 17 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
Sep 02 PHP
thinkPHP模型初始化实例分析
Dec 03 PHP
yii实现使用CUploadedFile上传文件的方法
Dec 28 PHP
PHP高精确度运算BC函数库实例详解
Aug 15 PHP
Laravel学习教程之IOC容器的介绍与用例
Aug 15 PHP
PHP树形结构tree类用法示例
Feb 01 PHP
微信推送功能实现方式图文详解
Jul 12 PHP
PHP判断是否是json字符串
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个人网站架设连环讲(三)
2006/10/09 PHP
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
PHP遍历二维数组的代码
2011/04/22 PHP
PHP 7.1新特性的汇总介绍
2016/12/16 PHP
PHP钩子与简单分发方式实例分析
2017/09/04 PHP
重载toString实现JS HashMap分析
2011/03/13 Javascript
js实现类似新浪微博首页内容渐显效果的方法
2015/04/10 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
微信小程序 textarea 详解及简单使用方法
2016/12/05 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
H5上传本地图片并预览功能
2017/05/08 Javascript
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
2017/08/09 jQuery
JS实现元素上下左右移动效果
2017/10/18 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
jQuery 实现倒计时天,时,分,秒功能
2018/07/31 jQuery
基于webpack4+vue-cli3项目实现换肤功能
2019/07/17 Javascript
NodeJs 实现简单WebSocket即时通讯的示例代码
2019/08/05 NodeJs
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
2014/07/04 Python
详解Python中的__new__、__init__、__call__三个特殊方法
2016/06/02 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
2019/06/19 Python
Python的log日志功能及设置方法
2019/07/11 Python
python数组循环处理方法
2019/08/26 Python
PyCharm 2020 激活到 2100 年的教程
2020/03/25 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
HTML5+WebSocket实现多文件同时上传的实例
2016/12/29 HTML / CSS
全球酒店比价网:HotelsCombined
2017/06/20 全球购物
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
工商企业管理实习自我鉴定
2013/12/04 职场文书
毕业生的自我评价
2013/12/30 职场文书
律师授权委托书范本
2014/10/07 职场文书
2016大学自主招生推荐信范文
2015/03/23 职场文书
tomcat下部署jenkins的方法
2022/05/06 Servers