新聞中心
使用的是“引用計(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ī)制回收。
創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)整合營銷推廣、網(wǎng)站重做改版、吳江網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、商城開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價格優(yōu)惠性價比高,為吳江等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
PHP5.3針對這個重大的缺陷做了優(yōu)化。雖然其基礎(chǔ)仍然是引用計(jì)數(shù),但是在做了一些改良,能夠?qū)h(huán)狀引用導(dǎo)致的內(nèi)存泄露控制在一定的規(guī)模以內(nèi)。當(dāng)然,這并不是說你可以隨便濫用內(nèi)存,編寫代碼時仍然要小心為上!
其他要點(diǎn):
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ū)域的引用計(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)置空,同時將其引用計(jì)數(shù)歸0”。根據(jù)我對這個定義的理解,=null操作可以立即釋放掉內(nèi)存空間!因此很多PHP技巧中不厭其煩地對我們說,先將變量設(shè)為null,再unset。理解其深層原理后,我才徹底理解了這樣做的原因!=null才是王道!
新聞名稱:PHP垃圾回收機(jī)制理解
分享網(wǎng)址:http://www.ef60e0e.cn/article/pgdphh.html