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

相關文章
相關標籤/搜索