总结PHP内存释放以及垃圾回收


Posted in PHP onMarch 29, 2018

引用赋值

$a = 'apple';
$b = &$a;

上述代码中,我将一个字符串赋值给变量a,然后将a的引用赋值给了变量b。显然,这个时候的内存指向应该是这样的:

$a -> 'apple' <- $b

a和b指向了同一块内存区域,我们通过 var_dump($a, $b) 得到 string(5) "apple" string(5) "apple" ,这是我们预期的结果。

unset 函数

假如我想将 'apple' 这个字符串从内存中释放掉。我是这么做的:

unset($a);

但是通过再次打印 $a $b 两变量的信息,我得到了这样的结果:Notice: Undefined variable: a 和 string(5) "apple" 。奇怪,$a $b 同时指向一块内存区域,又明明将$a释放了,为什么$b还是'apple'。

其实是这样的,unset()这是将一个变量指针销毁了,并没有释放掉那块内存区域中存放的字符串,所以执行完操作之后,内存指向只是变成了这样:

'apple' <- $b

要牢记重点: unset()并没有释放变量所指向的那块内存,而只是将变量指针销毁了。同时,将那块内存的 引用计数 减1,当引用计数为0时,也就是说当那块内存不被任何变量引用时,便会触发php的垃圾回收。

直接回收

那要怎样做才能真正释放掉 'apple' 所占用的内存呢?

利用上述方法,我们可以在 unset($a) 之后再 unset($b) ,将内存区域的所有引用都销毁,引用计数减为0了,自然就被php回收了。

当然,还有更直接的方法:

$a = null;

直接赋值 null 会将将 $a 所指向的内存区域置空,并将引用计数归零,内存便被释放。

脚本执行结束

php是脚本语言,当脚本执行结束之后,脚本内使用的所有内存都会被释放。

PHP 相关文章推荐
AJAX for PHP简单表数据查询实例
Jan 02 PHP
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
Aug 07 PHP
php数组函数序列之array_unshift() 在数组开头插入一个或多个元素
Nov 07 PHP
在windows服务器开启php的gd库phpinfo中未发现
Jan 13 PHP
下拉列表多级联动dropDownList示例代码
Jun 27 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
Nov 15 PHP
php生成图片缩略图功能示例
Feb 22 PHP
laravel中命名路由的使用方法
Feb 24 PHP
thinkPHP5.0框架URL访问方法详解
Mar 18 PHP
老生常谈PHP面向对象之解释器模式
May 17 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
May 13 PHP
thinkphp框架类库扩展操作示例
Nov 26 PHP
PHP+Ajax实现的博客文章添加类别功能示例
Mar 29 #PHP
PHP使用文件锁解决高并发问题示例
Mar 29 #PHP
PHP实现微信支付(jsapi支付)流程步骤详解
Mar 15 #PHP
PHP实现的数组和XML文件相互转换功能示例
Mar 15 #PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
Mar 15 #PHP
laravel框架关于搜索功能的实现
Mar 15 #PHP
PHP实现浏览器中直接输出图片的方法示例
Mar 14 #PHP
You might like
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
PHP基于单例模式实现的mysql类
2016/01/09 PHP
Windows下php+mysql5.7配置教程
2017/05/16 PHP
url 编码 js url传参中文乱码解决方案
2010/04/11 Javascript
jquery 图片轮换效果
2010/07/29 Javascript
Javascript中string转date示例代码
2013/11/01 Javascript
js处理自己不能定义二维数组的方法详解
2014/03/03 Javascript
jQuery 重复加载错误以及修复方法
2014/12/16 Javascript
javascript中使用正则表达式清理table样式的代码
2020/04/01 Javascript
jQuery结合CSS制作动态的下拉菜单
2015/10/27 Javascript
每天一篇javascript学习小结(Boolean对象)
2015/11/12 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
深入解析JavaScript中的arguments对象
2016/06/12 Javascript
javascript表单控件实例讲解
2016/09/13 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
2016/10/15 Javascript
原生js图片轮播效果实现代码
2016/10/19 Javascript
基于pako.js实现gzip的压缩和解压功能示例
2017/06/13 Javascript
vue之a-table中实现清空选中的数据
2019/11/07 Javascript
JS造成内存泄漏的几种情况实例分析
2020/03/02 Javascript
[05:09]第二届DOTA2亚洲邀请赛决赛日比赛集锦:iG 3:0 OG夺冠
2017/04/05 DOTA
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
python实现二维数组的对角线遍历
2019/03/02 Python
详解Python图像处理库Pillow常用使用方法
2019/09/02 Python
Python实现把多维数组展开成DataFrame
2019/11/30 Python
Django关于admin的使用技巧和知识点
2020/02/10 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
htmlentities() 和 htmlspecialchars()有什么区别
2015/07/01 面试题
北京华建集团SQL面试题
2014/06/03 面试题
班风口号
2014/06/18 职场文书
2014年安全生产工作总结
2014/11/13 职场文书
综合实践活动报告
2015/02/05 职场文书
Python文件的操作示例的详细讲解
2021/04/08 Python
python3实现常见的排序算法(示例代码)
2021/07/04 Python
CSS精灵图的原理与使用方法介绍
2022/03/17 HTML / CSS
vue实现Toast组件轻提示
2022/04/10 Vue.js