PHP垃圾回收机制理解
使用的是“引用計數(shù)”方式進行回收。簡單地理解的話,就是每個分配的內存區(qū)域都有一個計數(shù)器,記錄有多少個變量指針指向這片內存。當指向該片內存的指針數(shù)量為0,那么該片內存區(qū)域就可以被回收。
?
引用計數(shù)計數(shù)簡單,強大,但是有一個致命的缺陷,就是環(huán)狀引用??紤]以下的代碼:
?
Php代碼?
$a = array();?
$a[] = &$a;?
unset($a);?
變量$a引用了自己,形成了一個環(huán)。$a被unset了,可是由于存在環(huán)狀引用,因此$a之前指向的內存的引用計數(shù)為1,因此該內存區(qū)域不會被垃圾回收機制回收。
?
?
PHP5.3針對這個重大的缺陷做了優(yōu)化。雖然其基礎仍然是引用計數(shù),但是在做了一些改良,能夠將環(huán)狀引用導致的內存泄露控制在一定的規(guī)模以內。當然,這并不是說你可以隨便濫用內存,編寫代碼時仍然要小心為上!
?
?
其他要點:
1.PHP腳本運行完畢,該腳本申請的所有內存空間都會釋放,不管是否存在環(huán)狀引用。因此環(huán)狀引用內存泄露的問題一般只影響長時間運行的程序腳本。
?
2.垃圾回收機制需要滿足一定的條件才會執(zhí)行。因此unset后,系統(tǒng)并不一定會立即回收垃圾。
?
3.unset的作用。
“unset只是斷開一個變量到一塊內存區(qū)域的連接,同時將該內存區(qū)域的引用計數(shù)-1”。也就是說,如果有一個以上的變量指向同一個內存區(qū)域,或者存在環(huán)狀引用,那么unset不會使內存區(qū)域釋放。斷開也說明unset并不會直接刪除內存區(qū)域,而只是改變其引用計數(shù)而已。
?
4.$xx=null的作用。
“$a = null 是直接將$a 指向的數(shù)據(jù)結構置空,同時將其引用計數(shù)歸0”。根據(jù)我對這個定義的理解,=null操作可以立即釋放掉內存空間!因此很多PHP技巧中不厭其煩地對我們說,先將變量設為null,再unset。理解其深層原理后,我才徹底理解了這樣做的原因!=null才是王道!
轉載于:https://www.cnblogs.com/zhangyuhang3/p/6873619.html
總結
以上是生活随笔為你收集整理的PHP垃圾回收机制理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【工具与解决方案】从做项目中积累学习
- 下一篇: php多条件查询