Heim  >  Artikel  >  Backend-Entwicklung  >  PHP垃圾回收机制的了解

PHP垃圾回收机制的了解

WBOY
WBOYOriginal
2016-06-13 13:20:41876Durchsuche

PHP垃圾回收机制的理解

本文主要讨论PHP5.2和5.3的垃圾回收机制区别。

?

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

?

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

?

$a = array();
$a[] = &$a;
unset($a);
?


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

?

?

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

?

?

其他要点:

1.PHP脚本运行完毕,该脚本申请的所有内存空间都会释放,不管是否存在环状引用。因此环状引用内存泄露的问题一般只影响长时间运行的程序脚本。

?

2.垃圾回收机制需要满足一定的条件才会执行。因此unset后,系统并不一定会立即回收垃圾。

?

3.unset的作用。

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

?

4.$xx=null的作用。

“$a = null 是直接将$a 指向的数据结构置空,同时将其引用计数归0”。根据我对这个定义的理解,=null操作可以立即释放掉内存空间!因此很多PHP技巧中不厌其烦地对我们说,先将变量设为null,再unset。理解其深层原理后,我才彻底理解了这样做的原因!=null才是王道!

?

?

?

更多的资料请看:

http://wenku.baidu.com/view/564573c62cc58bd63186bd35.html

http://apps.hi.baidu.com/share/detail/46642891

?

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn