天天看點

PHP垃圾回收機制了解

使用的是“引用計數”方式進行回收。簡單地了解的話,就是每個配置設定的記憶體區域都有一個計數器,記錄有多少個變量指針指向這片記憶體。當指向該片記憶體的指針數量為0,那麼該片記憶體區域就可以被回收。

引用計數計數簡單,強大,但是有一個緻命的缺陷,就是環狀引用。考慮以下的代碼:

Php代碼

$a = array();

$a[] = &$a;

unset($a);

變量$a引用了自己,形成了一個環。$a被unset了,可是由于存在環狀引用,是以$a之前指向的記憶體的引用計數為1,是以該記憶體區域不會被垃圾回收機制回收。

PHP5.3針對這個重大的缺陷做了優化。雖然其基礎仍然是引用計數,但是在做了一些改良,能夠将環狀引用導緻的記憶體洩露控制在一定的規模以内。當然,這并不是說你可以随便濫用記憶體,編寫代碼時仍然要小心為上!

其他要點:

1.PHP腳本運作完畢,該腳本申請的所有記憶體空間都會釋放,不管是否存在環狀引用。是以環狀引用記憶體洩露的問題一般隻影響長時間運作的程式腳本。