总结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 setcookie() cannot modify header information 的解决方法
Jan 09 PHP
程序员编程十条戒律
Jul 09 PHP
无法载入 mcrypt 扩展,请检查 PHP 配置终极解决方案
Jul 18 PHP
php中通过curl smtp发送邮件
Jun 05 PHP
Yii核心组件AssetManager原理分析
Dec 02 PHP
Laravel中使用自己编写类库的3种方法
Feb 10 PHP
PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
Jul 01 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
Aug 03 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
Dec 25 PHP
laravel 框架执行流程与原理简单分析
Feb 01 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 PHP
PHP实现简易用户登录系统
Jul 10 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模拟HTTP认证
2006/10/09 PHP
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
php比较两个绝对时间的大小
2014/01/31 PHP
zf框架的registry(注册表)使用示例
2014/03/13 PHP
PHP+ajax分页实例简析
2015/12/07 PHP
php session实现多级目录存放实现代码
2016/02/03 PHP
浅谈PHP中的错误处理和异常处理
2017/02/04 PHP
Laravel 的数据库迁移的方法
2017/07/31 PHP
thinkphp5框架前后端分离项目实现分页功能的方法分析
2019/10/08 PHP
jQuery1.3.2 升级到jQuery1.4.4需要修改的地方
2011/01/06 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
2014/02/17 Javascript
学习JavaScript编程语言的8张思维导图分享
2015/03/27 Javascript
基于JavaScript实现 网页切出 网站title变化代码
2016/04/03 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
angular实现商品筛选功能
2017/02/01 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
2018/07/12 jQuery
vue实现一个炫酷的日历组件
2018/10/08 Javascript
[01:06:54]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第一场 1月24日
2021/03/11 DOTA
python3.4用循环往mysql5.7中写数据并输出的实现方法
2017/06/20 Python
python kmeans聚类简单介绍和实现代码
2018/02/23 Python
kaggle+mnist实现手写字体识别
2018/07/26 Python
django如何实现视图重定向
2019/07/24 Python
parser.add_argument中的action使用
2020/04/20 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
2020/05/19 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
2021/02/06 Python
HTML5全屏(Fullscreen)API详细介绍
2015/04/24 HTML / CSS
美国婴儿用品店:Babies”R”Us
2017/10/12 全球购物
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
大一自我鉴定范文
2013/12/27 职场文书
“学雷锋活动月”总结
2014/03/09 职场文书
社区健康教育实施方案
2014/03/18 职场文书
知识改变命运演讲稿
2014/05/21 职场文书
计算机网络专业自荐书
2014/06/09 职场文书
小学生我的梦想演讲稿
2014/08/21 职场文书
2014年高中教师工作总结
2014/12/19 职场文书
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript