总结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 相关文章推荐
自己前几天写的无限分类类
Feb 14 PHP
优化php效率,提高php性能的一些方法
Mar 24 PHP
php缓冲 output_buffering和ob_start使用介绍
Jan 30 PHP
zf框架的zend_cache缓存使用方法(zend框架)
Mar 14 PHP
PHP函数addslashes和mysql_real_escape_string的区别
Apr 22 PHP
PHP清除字符串中所有无用标签的方法
Dec 01 PHP
7个鲜为人知却非常实用的PHP函数
Jul 01 PHP
使用WAMP搭建PHP本地开发环境
May 10 PHP
php7安装yar扩展的方法详解
Aug 03 PHP
PHP清除缓存的几种方法总结
Sep 12 PHP
php通过pecl方式安装扩展的实例讲解
Feb 02 PHP
PHP SESSION跨页面传递失败解决方案
Dec 11 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上传图片到指定位置路径保存到数据库的具体实现
2013/12/30 PHP
php实现水仙花数的4个示例分享
2014/04/08 PHP
php针对cookie操作的队列操作类实例
2014/12/10 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
PHP使用SMTP邮件服务器发送邮件示例
2018/08/28 PHP
php实现JWT(json web token)鉴权实例详解
2019/11/05 PHP
js几个验证函数代码
2010/03/25 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
js与jQuery 获取父窗、子窗的iframe
2013/12/20 Javascript
Javscript调用iframe框架页面中函数的方法
2014/11/01 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
2016/01/22 Javascript
使用原生js+canvas实现模拟心电图的实例
2017/09/20 Javascript
简述Angular 5 快速入门
2017/11/04 Javascript
vue 路由页面之间实现用手指进行滑动的方法
2018/02/23 Javascript
NodeJs实现简单的爬虫功能案例分析
2018/12/05 NodeJs
jQuery each和js forEach用法比较
2019/02/27 jQuery
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
vue 遮罩层阻止默认滚动事件操作
2020/07/28 Javascript
vite2.0+vue3移动端项目实战详解
2021/03/03 Vue.js
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
Python操作MongoDB数据库PyMongo库使用方法
2015/04/27 Python
python opencv旋转图像(保持图像不被裁减)
2018/07/26 Python
详解如何在Apache中运行Python WSGI应用
2019/01/02 Python
PyCharm 设置SciView工具窗口的方法
2019/01/15 Python
python实现维吉尼亚算法
2019/03/20 Python
Django 实现外键去除自动添加的后缀‘_id’
2019/11/15 Python
在pycharm中为项目导入anacodna环境的操作方法
2020/02/12 Python
ellesse美国官方商店:意大利高级运动服品牌
2019/10/29 全球购物
营销总经理岗位职责
2014/02/02 职场文书
旅游管理毕业生自荐书
2014/02/02 职场文书
食品采购员岗位职责
2014/04/14 职场文书
股东出资证明书范例
2014/10/04 职场文书
党的群众路线教育实践活动个人对照检查材料(教师)
2014/11/04 职场文书
三行辞职书范文
2015/02/26 职场文书
校长个人总结
2015/03/03 职场文书
学术会议通知
2015/04/15 职场文书