PHP垃圾回收机制理解

使用的是“引用计数”方式进行回收。简单地理解的话,就是每一个分配的内存区域都有一个计数器,记录有多少个变量指针指向这片内存。当指向该片内存的指针数量为0,那么该片内存区域就能够被回收。
引用计数计数简单,强大,可是有一个致命的缺陷,就是环状引用。考虑如下的代码:
Php代码
$a = array();
$a[] = &$a;
unset($a);
变量$a引用了本身,造成了一个环。$a被unset了,但是因为存在环状引用,所以$a以前指向的内存的引用计数为1,所以该内存区域不会被垃圾回收机制回收。 数据结构

PHP5.3针对这个重大的缺陷作了优化。虽然其基础仍然是引用计数,可是在作了一些改良,可以将环状引用致使的内存泄露控制在必定的规模之内。固然,这并非说你能够随便滥用内存,编写代码时仍然要当心为上! ide

其余要点:
1.PHP脚本运行完毕,该脚本申请的全部内存空间都会释放,无论是否存在环状引用。所以环状引用内存泄露的问题通常只影响长时间运行的程序脚本。优化

2.垃圾回收机制须要知足必定的条件才会执行。所以unset后,系统并不必定会当即回收垃圾。指针

3.unset的做用。
“unset只是断开一个变量到一块内存区域的链接,同时将该内存区域的引用计数-1”。也就是说,若是有一个以上的变量指向同一个内存区域,或者存在环状引用,那么unset不会使内存区域释放。断开也说明unset并不会直接删除内存区域,而只是改变其引用计数而已。内存

4.$xx=null的做用。
“$a = null 是直接将$a 指向的数据结构置空,同时将其引用计数归0”。根据我对这个定义的理解,=null操做能够当即释放掉内存空间!所以不少PHP技巧中不厌其烦地对咱们说,先将变量设为null,再unset。理解其深层原理后,我才完全理解了这样作的缘由!=null才是王道!it

相关文章
相关标签/搜索