总结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 相关文章推荐
PHP6 mysql连接方式说明
Feb 09 PHP
php中计算时间差的几种方法
Dec 31 PHP
php购物网站支付paypal使用方法
Nov 28 PHP
PHP中操作ini配置文件的方法
Apr 25 PHP
php笔记之:有规律大文件的读取与写入的分析
Apr 26 PHP
php类常量的使用详解
Jun 08 PHP
PHP文件上传判断file是否己选择上传文件的方法
Nov 10 PHP
分享最受欢迎的5款PHP框架
Nov 27 PHP
thinkphp中字符截取函数msubstr()用法分析
Jan 09 PHP
PHP 获取指定地区的天气实例代码
Feb 08 PHP
PHP设计模式之模板方法模式实例浅析
Dec 20 PHP
PHP实现计算器小功能
Aug 28 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全概率运算函数(优化版) Webgame开发必备
2011/07/04 PHP
php发送与接收流文件的方法
2015/02/11 PHP
thinkPHP下ueditor的使用方法详解
2015/12/26 PHP
php版微信自动获取收货地址api用法示例
2016/09/22 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
Laravel框架实现定时Task Scheduling例子
2019/10/22 PHP
javascript与CSS复习(二)
2010/06/29 Javascript
JS等比例缩小图片尺寸的实例
2013/02/27 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
2015/03/01 Javascript
jQuery实现的简单提示信息插件
2015/12/08 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
JS中的进制转换以及作用
2016/06/26 Javascript
Bootstrap缩略图与警告框学习使用
2017/02/08 Javascript
在js中做数字字符串补0(js补零)
2017/03/25 Javascript
jQuery实现jQuery-form.js实现异步上传文件
2017/04/28 jQuery
详解vuejs之v-for列表渲染
2017/06/22 Javascript
JavaScript碎片—函数闭包(模拟面向对象)
2019/03/13 Javascript
python列表去重的二种方法
2014/02/14 Python
详解Python当中的字符串和编码
2015/04/25 Python
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
pandas重新生成索引的方法
2018/11/06 Python
Pandas DataFrame 取一行数据会得到Series的方法
2018/11/10 Python
Python判断对象是否为文件对象(file object)的三种方法示例
2019/04/26 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
2019/05/28 Python
python用requests实现http请求代码实例
2019/10/31 Python
django框架两个使用模板实例
2019/12/11 Python
小 200 行 Python 代码制作一个换脸程序
2020/05/12 Python
keras的siamese(孪生网络)实现案例
2020/06/12 Python
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
亲子拓展活动方案
2014/02/20 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书
求职推荐信范文
2015/03/27 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书
Python3 类型标注支持操作
2021/06/02 Python
聊聊Lombok中的@Builder注解使用教程
2021/11/17 Java/Android