总结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 相关文章推荐
dedecms后台验证码总提示错误的解决方法
Mar 21 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
Jun 28 PHP
php Calender(日历)代码分享
Jan 03 PHP
php发送get、post请求的6种方法简明总结
Jul 08 PHP
配置php.ini实现PHP文件上传功能
Nov 27 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
Jan 22 PHP
php去除头尾空格的2种方法
Mar 16 PHP
twig里使用js变量的方法
Feb 05 PHP
php中简单的对称加密算法实现
Jan 05 PHP
/etc/php-fpm.d/www.conf 配置注意事项
Feb 04 PHP
php正则判断是否为合法身份证号的方法
Mar 16 PHP
laravel-admin的多级联动方法
Sep 30 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世纪万年历
2006/12/06 PHP
Yii框架form表单用法实例
2014/12/04 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
基于Laravel 5.2 regex验证的正确写法
2019/09/29 PHP
Jquery之Ajax运用 学习运用篇
2011/09/26 Javascript
浅谈重写window对象的方法
2014/12/29 Javascript
jQuery+AJAX实现网页无刷新上传
2015/02/22 Javascript
JQuery实现样式设置、追加、移除与切换的方法
2015/06/11 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
2015/07/21 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
js计算系统当前日期是星期几的方法
2016/07/14 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
ionic2 tabs 图标自定义实例
2017/03/08 Javascript
vue计算属性时v-for处理数组时遇到的一个bug问题
2018/01/21 Javascript
浅谈React组件之性能优化
2018/03/02 Javascript
vue实现滑动到底部加载更多效果
2020/10/27 Javascript
node.js express捕获全局异常的三种方法实例分析
2019/12/27 Javascript
[03:15]DOTA2-DPC中国联赛1月22日Recap集锦
2021/03/11 DOTA
Scrapy的简单使用教程
2017/10/24 Python
python实现对文件中图片生成带标签的txt文件方法
2018/04/27 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
2018/07/06 Python
Python 单例设计模式用法实例分析
2019/09/23 Python
Ubuntu中配置TensorFlow使用环境的方法
2020/04/21 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
2020/04/30 Python
python中把元组转换为namedtuple方法
2020/12/09 Python
python 通过exifread读取照片信息
2020/12/24 Python
在使用非全零作为空指针内部表达的机器上, NULL是如何定义
2014/11/09 面试题
语文教育专业推荐信范文
2013/11/25 职场文书
网络宣传方案
2014/03/15 职场文书
兽医医药专业求职信
2014/07/27 职场文书
如何写新闻稿
2015/07/18 职场文书
浅谈Python魔法方法
2021/06/28 Java/Android
maven依赖的version声明控制方式
2022/01/18 Java/Android
Go 内联优化让程序员爱不释手
2022/06/21 Golang
小程序实现侧滑删除功能
2022/06/25 Javascript
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS