使用的是“引用計數(shù)”方式進(jìn)行回收。簡單地理解的話,就是每個分配的內(nèi)存區(qū)域都有一個計數(shù)器,記錄有多少個變量指針指向這片內(nèi)存。當(dāng)指向該片內(nèi)存的指針數(shù)量為0,那么該片內(nèi)存區(qū)域就可以被回收。
引用計數(shù)計數(shù)簡單,強(qiáng)大,但是有一個致命的缺陷,就是環(huán)狀引用??紤]以下的代碼:
Php代碼
$a = array();
$a[] = &$a;
unset($a);
變量$a引用了自己,形成了一個環(huán)。$a被unset了,可是由于存在環(huán)狀引用,因此$a之前指向的內(nèi)存的引用計數(shù)為1,因此該內(nèi)存區(qū)域不會被垃圾回收機(jī)制回收。
PHP5.3針對這個重大的缺陷做了優(yōu)化。雖然其基礎(chǔ)仍然是引用計數(shù),但是在做了一些改良,能夠?qū)h(huán)狀引用導(dǎo)致的內(nèi)存泄露控制在一定的規(guī)模以內(nèi)。當(dāng)然,這并不是說你可以隨便濫用內(nèi)存,編寫代碼時仍然要小心為上!
其他要點:
1.PHP腳本運(yùn)行完畢,該腳本申請的所有內(nèi)存空間都會釋放,不管是否存在環(huán)狀引用。因此環(huán)狀引用內(nèi)存泄露的問題一般只影響長時間運(yùn)行的程序腳本。
2.垃圾回收機(jī)制需要滿足一定的條件才會執(zhí)行。因此unset后,系統(tǒng)并不一定會立即回收垃圾。
3.unset的作用。
“unset只是斷開一個變量到一塊內(nèi)存區(qū)域的連接,同時將該內(nèi)存區(qū)域的引用計數(shù)-1”。也就是說,如果有一個以上的變量指向同一個內(nèi)存區(qū)域,或者存在環(huán)狀引用,那么unset不會使內(nèi)存區(qū)域釋放。斷開也說明unset并不會直接刪除內(nèi)存區(qū)域,而只是改變其引用計數(shù)而已。
4.$xx=null的作用。
“$a = null 是直接將$a 指向的數(shù)據(jù)結(jié)構(gòu)置空,同時將其引用計數(shù)歸0”。根據(jù)我對這個定義的理解,=null操作可以立即釋放掉內(nèi)存空間!因此很多PHP技巧中不厭其煩地對我們說,先將變量設(shè)為null,再unset。理解其深層原理后,我才徹底理解了這樣做的原因!=null才是王道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。