就是垃圾回收器,全稱Garbage Collection。
-
php中垃圾是如何定義的?
準確地說,判斷是否爲垃圾,主要看有沒有變量名指向變量容器zval,如果沒有則認爲是垃圾,需要釋放。 -
5.3版本以後php是如何處理垃圾內存的?
判斷處理過程
.如果一個zval的refcount增加,那麼此zval還在使用,不屬於垃圾
.如果一個zval的refcount減少到0, 那麼zval可以被釋放掉,不屬於垃圾
.如果一個zval的refcount減少之後大於0,那麼此zval還不能被釋放,此zval可能成爲一個垃圾
就是對此zval中的每個元素進行一次refcount減1操作,操作完成之後,如果zval的refcount=0,那麼這個zval就是一個垃圾 -
對於一個包含環形引用的數組,對數組中包含的每個元素的zval進行減1操作,之後如果發現數組自身的zval的refcount變成了0,那麼可以判斷這個數組是一個垃圾
-
優化配置:會有一個緩衝區的概念,等緩衝區滿了纔會一次性去給清掉。緩衝區默認可以放10,000個節點,當緩衝區滿了纔會清理。
-
php.ini中設置 zend.enable_gc 項來開啓或則關閉GC。gc_enable() : 開啓GC gc_disable() : 關閉GC
gc_collect_cycles() : 在節點緩衝區未滿的情況下強制執行垃圾分析算法 - 涉及到垃圾回收的知識點
.unset只是斷開一個變量到一塊內存區域的連接,同時將該內存區域的引用計數-1;內存是否回收主要還是看refount是否到0了,以及gc算法判斷
.a=null是直接將a 指向的數據結構置空,同時將其引用計數歸0
.腳本執行結束,該腳本中使用的所有內存都會被釋放,不論是否有引用環