总结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 相关文章推荐
功能齐全的PHP发送邮件类代码附详细说明
Jul 10 PHP
PHP中其实也可以用方法链
Nov 10 PHP
解析php中如何直接执行SHELL
Jun 28 PHP
PDO预处理语句PDOStatement对象使用总结
Nov 20 PHP
php字符串截取函数用法分析
Nov 25 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
May 21 PHP
PHP获取昨天、今天及明天日期的方法
Feb 03 PHP
功能强大的php分页函数
Jul 20 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
Sep 22 PHP
Zend Framework常用校验器详解
Dec 09 PHP
php微信支付之公众号支付功能
May 30 PHP
Laravel框架实现的rbac权限管理操作示例
Jan 16 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
PHP中文汉字验证码
2007/04/08 PHP
坏狼的PHP学习教程之第2天
2008/06/15 PHP
Linux fgetcsv取得的数组元素为空字符串的解决方法
2011/11/25 PHP
php实现MD5加密16位(不要默认的32位)
2013/08/12 PHP
php define的第二个参数使用方法
2013/11/04 PHP
PHP实现的QQ空间g_tk加密算法
2015/07/09 PHP
深入理解PHP+Mysql分布式事务与解决方案
2020/12/03 PHP
IE8 chrome中table隔行换色解决办法
2010/07/09 Javascript
最佳的addEvent事件绑定是怎样诞生的
2011/10/24 Javascript
js opener的使用详解
2014/01/11 Javascript
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
JQuery替换DOM节点的方法
2015/06/11 Javascript
JS把内容动态插入到DIV的实现方法
2016/07/19 Javascript
JavaScript三种绑定事件方式及相互之间的区别分析
2017/01/10 Javascript
jQuery中Chosen三级联动功能实例代码
2017/03/07 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
2018/05/31 Javascript
vue2.0获取鼠标位置的方法
2018/09/13 Javascript
mpvue网易云短信接口实现小程序短信登录的示例代码
2020/04/03 Javascript
JavaScript对象字面量和构造函数原理与用法详解
2020/04/18 Javascript
详解JSON.stringify()的5个秘密特性
2020/05/26 Javascript
js实现双人五子棋小游戏
2020/05/28 Javascript
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
Python正则表达式教程之一:基础篇
2017/03/02 Python
Python实现统计代码行的方法分析
2017/07/12 Python
Python基于递归算法实现的走迷宫问题
2017/08/04 Python
用不到50行的Python代码构建最小的区块链
2017/11/16 Python
python smtplib发送带附件邮件小程序
2018/05/22 Python
Python多继承原理与用法示例
2018/08/23 Python
Python产生Gnuplot绘图数据的方法
2018/11/09 Python
华为慧通笔试题
2016/04/22 面试题
初始化了一个没有run()方法的线程类,是否会出错?
2014/03/27 面试题
机械工程师求职自我评价
2013/09/23 职场文书
体育教育毕业生自荐信
2014/06/29 职场文书
房屋授权委托书范本
2014/10/07 职场文书
介绍信的格式
2015/01/30 职场文书
浅谈Python基础之列表那些事儿
2021/05/11 Python