总结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中目录,文件操作详谈
Mar 19 PHP
php面向对象全攻略 (二) 实例化对象 使用对象成员
Sep 30 PHP
简单的php缓存类分享     php缓存机制
Jan 22 PHP
php发送post请求的三种方法
Feb 11 PHP
CMS中PHP判断系统是否已经安装的方法示例
Jul 26 PHP
php使用mysqli向数据库添加数据的方法
Mar 20 PHP
php实现微信公众号主动推送消息
Dec 31 PHP
[原创]CI(CodeIgniter)简单统计访问人数实现方法
Jan 19 PHP
smarty模板数学运算示例
Dec 11 PHP
php生成0~1随机小数的方法(必看)
Apr 05 PHP
php记录搜索引擎爬行记录的实现代码
Mar 02 PHP
Yii2框架加载css和js文件的方法分析
May 25 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函数utf8转gb2312编码
2006/12/21 PHP
javascript some()函数用法详解
2014/11/13 PHP
php中JSON的使用方法
2015/04/30 PHP
PHP模板引擎Smarty内置变量调解器用法详解
2016/04/11 PHP
Yii2前后台分离及migrate使用(七)
2016/05/04 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
2019/04/23 PHP
深入理解JavaScript系列(3) 全面解析Module模式
2012/01/15 Javascript
jQuery的live()方法对hover事件的处理示例
2014/02/27 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
JS拖拽组件学习使用
2016/01/19 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
Angularjs单选改为多选的开发过程及问题解析
2017/02/17 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
2017/04/07 Javascript
Angular中$state.go页面跳转并传递参数的方法
2017/05/09 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
详解如何创建并发布一个 vue 组件
2018/11/08 Javascript
说说如何使用Vuex进行状态管理(小结)
2019/04/14 Javascript
Vue组件之高德地图地址选择功能的实例代码
2019/06/21 Javascript
Python语言技巧之三元运算符使用介绍
2013/03/04 Python
在Docker上开始部署Python应用的教程
2015/04/17 Python
详解Python中映射类型的内建函数和工厂函数
2015/08/19 Python
python difflib模块示例讲解
2017/09/13 Python
Python模拟脉冲星伪信号频率实例代码
2018/01/03 Python
Django 2.0版本的新特性抢先看!
2018/01/05 Python
python实现用户答题功能
2018/01/17 Python
儿童编程python入门
2018/05/08 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
python pandas生成时间列表
2019/06/29 Python
css3动画事件—webkitAnimationEnd与计时器time事件
2013/01/31 HTML / CSS
介绍一下gcc特性
2015/10/31 面试题
大学生志愿者感言
2014/01/15 职场文书
一岗双责责任书
2014/04/15 职场文书
工作所在部门证明
2014/09/21 职场文书
观看安全警示教育片心得体会
2016/01/15 职场文书