溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP垃圾回收機(jī)制理解

發(fā)布時(shí)間:2020-08-13 18:36:49 來源:網(wǎng)絡(luò) 閱讀:484 作者:new個對象 欄目:web開發(fā)

使用的是“引用計(jì)數(shù)”方式進(jìn)行回收。簡單地理解的話,就是每個分配的內(nèi)存區(qū)域都有一個計(jì)數(shù)器,記錄有多少個變量指針指向這片內(nèi)存。當(dāng)指向該片內(nèi)存的指針數(shù)量為0,那么該片內(nèi)存區(qū)域就可以被回收。
引用計(jì)數(shù)計(jì)數(shù)簡單,強(qiáng)大,但是有一個致命的缺陷,就是環(huán)狀引用??紤]以下的代碼:
Php代碼
$a = array();
$a[] = &$a;
unset($a);
變量$a引用了自己,形成了一個環(huán)。$a被unset了,可是由于存在環(huán)狀引用,因此$a之前指向的內(nèi)存的引用計(jì)數(shù)為1,因此該內(nèi)存區(qū)域不會被垃圾回收機(jī)制回收。

PHP5.3針對這個重大的缺陷做了優(yōu)化。雖然其基礎(chǔ)仍然是引用計(jì)數(shù),但是在做了一些改良,能夠?qū)h(huán)狀引用導(dǎo)致的內(nèi)存泄露控制在一定的規(guī)模以內(nèi)。當(dāng)然,這并不是說你可以隨便濫用內(nèi)存,編寫代碼時(shí)仍然要小心為上!

其他要點(diǎn):
1.PHP腳本運(yùn)行完畢,該腳本申請的所有內(nèi)存空間都會釋放,不管是否存在環(huán)狀引用。因此環(huán)狀引用內(nèi)存泄露的問題一般只影響長時(shí)間運(yùn)行的程序腳本。

2.垃圾回收機(jī)制需要滿足一定的條件才會執(zhí)行。因此unset后,系統(tǒng)并不一定會立即回收垃圾。

3.unset的作用。
“unset只是斷開一個變量到一塊內(nèi)存區(qū)域的連接,同時(shí)將該內(nèi)存區(qū)域的引用計(jì)數(shù)-1”。也就是說,如果有一個以上的變量指向同一個內(nèi)存區(qū)域,或者存在環(huán)狀引用,那么unset不會使內(nèi)存區(qū)域釋放。斷開也說明unset并不會直接刪除內(nèi)存區(qū)域,而只是改變其引用計(jì)數(shù)而已。

4.$xx=null的作用。
“$a = null 是直接將$a 指向的數(shù)據(jù)結(jié)構(gòu)置空,同時(shí)將其引用計(jì)數(shù)歸0”。根據(jù)我對這個定義的理解,=null操作可以立即釋放掉內(nèi)存空間!因此很多PHP技巧中不厭其煩地對我們說,先將變量設(shè)為null,再unset。理解其深層原理后,我才徹底理解了這樣做的原因!=null才是王道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI