总结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解析html类库simple_html_dom(详细介绍)
Jul 05 PHP
php 下载保存文件保存到本地的两种实现方法
Aug 12 PHP
php弹出对话框实现重定向代码
Jan 23 PHP
PHP判断是否有Get参数的方法
May 05 PHP
php之curl实现http与https请求的方法
Oct 21 PHP
PHP实现服务器状态监控的方法
Dec 09 PHP
如何使用PHP对网站验证码进行破解
Sep 17 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
Feb 16 PHP
初识PHP中的Swoole
Apr 05 PHP
PHP中的多种加密技术及代码示例解析
Oct 20 PHP
php实现数组重复数字统计实例
Sep 30 PHP
Thinkphp5框架异常处理操作实例分析
Jun 03 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使之能同时支持GIF和JPEG
2006/10/09 PHP
php实现的获取网站备案信息查询代码(360)
2013/09/23 PHP
php  单例模式详细介绍及实现源码
2016/11/05 PHP
PHP图片水印类的封装
2017/07/06 PHP
js下利用控制器载入对应脚本
2010/07/17 Javascript
Prototype源码浅析 String部分(三)之HTML字符串处理
2012/01/15 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
2015/04/01 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
2015/12/10 Javascript
jQuery使用$.ajax进行即时验证实例详解
2015/12/11 Javascript
jquery DataTable实现前后台动态分页
2017/06/17 jQuery
JS遍历DOM文档树的方法实例详解
2018/04/03 Javascript
nodejs 日志模块winston的使用方法
2018/05/02 NodeJs
javascript全局自定义鼠标右键菜单
2020/12/08 Javascript
[01:32]2016国际邀请赛中国区预选赛IG战队首日赛后采访
2016/06/27 DOTA
[47:03]完美世界DOTA2联赛PWL S3 access vs LBZS 第一场 12.20
2020/12/23 DOTA
跟老齐学Python之字典,你还记得吗?
2014/09/20 Python
在Python中使用base64模块处理字符编码的教程
2015/04/28 Python
Python中模块与包有相同名字的处理方法
2017/05/05 Python
python回调函数中使用多线程的方法
2017/12/25 Python
Python内置模块ConfigParser实现配置读写功能的方法
2018/02/12 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
2018/11/06 Python
Python中拆分字符串的操作方法
2019/07/23 Python
html5使用canvas实现图片下载功能的示例代码
2017/08/26 HTML / CSS
HTML5中如何显示视频呢 HTML5视频播放demo
2013/06/08 HTML / CSS
极度干燥澳大利亚官方网站:Superdry澳大利亚
2019/03/28 全球购物
Bonami斯洛伐克:购买家具和家居饰品
2019/07/02 全球购物
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
2014年医学生毕业自我鉴定
2014/03/26 职场文书
公司请假条格式
2014/04/11 职场文书
供货协议书范本
2014/04/22 职场文书
建筑工地质量标语
2014/06/12 职场文书
合伙经营协议书范本
2014/09/13 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
七年级作文之《我和我的祖国》观后感作文
2019/10/18 职场文书
Windows中Redis安装配置流程并实现远程访问功能
2021/06/07 Redis