教程集 www.jiaochengji.com
教程集 >  脚本编程  >  php  >  正文 php垃圾回收机制解析

php垃圾回收机制解析

发布时间:2018-03-21   编辑:jiaochengji.com
本文介绍了php垃圾回收机制的相关知识,php5中推出的垃圾回收机制,使用引用计数方式进行回收,灵活运用php垃圾回收机制可以提高php代码性能,有需要的朋友参考下。

说说php垃圾回收机制,每一种语言都自己的自动垃圾回收机制,让程序执行完之后会自动清除内存。

php 垃圾回收机制(garbage collector 简称gc)

5.2使用“引用计数”方式进行回收。
即每个分配的内存区域都有一个计数器,记录有多少个变量指针指向这片内存。当指向该片内存的指针数量为0,那么该片内存区域就可以被回收。

引用计数计数简单,强大,但是有一个致命的缺陷,就是环状引用。
代码:
 

复制代码 代码示例:
$a = array();
$a[] = &$a;
unset($a);

变量$a引用了自己,形成了一个环。$a被unset了,可是由于存在环状引用,因此$a之前指向的内存的引用计数为1,因此该内存区域不会被垃圾回收机制回收。

php5.3针对这个重大的缺陷做了优化。虽然其基础仍然是引用计数,但是在做了一些改良,能够将环状引用导致的内存泄露控制在一定的规模以内。
当然,这并不是说你可以随便滥用内存,编写代码时仍然要小心为上!(脚本学堂 www.jbxue.com)

其他要点:
1、php脚本运行完毕,该脚本申请的所有内存空间都会释放,不管是否存在环状引用。因此环状引用内存泄露的问题一般只影响长时间运行的程序脚本。
2、垃圾回收机制需要满足一定的条件才会执行。因此unset后,系统并不一定会立即回收垃圾。
3、unset的作用。
“unset只是断开一个变量到一块内存区域的连接,同时将该内存区域的引用计数-1”。
如果有一个以上的变量指向同一个内存区域,或者存在环状引用,那么unset不会使内存区域释放。断开也说明unset并不会直接删除内存区域,而只是改变其引用计数而已。
4、$xx=null的作用。
“$a = null 是直接将$a 指向的数据结构置空,同时将其引用计数归0”。根据我对这个定义的理解,=null操作可以立即释放掉内存空间!
因此很多php技巧中不厌其烦地对我们说,先将变量设为null,再unset。理解其深层原理后,我才彻底理解了这样做的原因!=null才是王道!

您可能感兴趣的文章:
php垃圾回收机制解析
有关PHP5.3的垃圾回收机制
php垃圾回收机制处理办法
Golang垃圾回收机制
PHP是如何做垃圾回收的(图文)
PHP垃圾回收机制分析
如何利用Python进行垃圾分类
php析构函数与垃圾回收机制
Golang理解-垃圾回收机制
java中HotSpot算法及垃圾收集器简介

关键词: php垃圾回收机制   
[关闭]
~ ~