1) PHP的垃圾回收週期是在引用計數減少到非零值時產生的。因此首先需要了解引用計數的知識。
2) 每個php變數存在一個叫"zval"的變數容器中。一個zval變數容器,除了包含變數的類型和值,還包括兩個位元組的額外資訊。第一個是"is_ref",是個bool值,用來識別這個變數是否是屬於引用集合(reference set)。
3) 第二個額外位元組是"refcount",用以表示指向這個zval變數容器的變數(也稱符號即symbol)個數。
5) 把一個變數賦值給另一個變數會增加引用次數(refcount)。當任何關聯到某個變數容器的變數離開它的作用域(例如:函數執行結束),或是對變數呼叫了函數 unset()時,”refcount「就會減1。
4) 測試程式碼範例:
$str = 'Hello World!';xdebug_debug_zval('str');$str1 = $str2 = $str;xdebug_debug_zval('str');unset($str1);xdebug_debug_zval('str');
以上範例輸出
str:(refcount=1, is_ref=0),string 'Hello World!' (length=12)str:(refcount=3, is_ref=0),string 'Hello World!' (length=12)str:(refcount=2, is_ref=0),string 'Hello World!' (length=12)
1) 在引用計數減少到非零值時,才會產生垃圾週期(garbage cycle)。其次,在一個垃圾週期中,透過檢查引用計數是否減1,並且檢查哪些變數容器的引用次數是零,來發現哪一部分是垃圾。
2) PHP垃圾回收的演算法是模擬刪除、模擬恢復、真的刪除,每個動作都使用深搜遍歷。
3) PHP回收機制的配置:zend.enable_gc。也能透過分別呼叫gc_enable() 和 gc_disable()函數來開啟和關閉垃圾回收機制,在呼叫gc_disable()函數釋放記憶體之前,先呼叫gc_collect_cycles()函數可能比較明智。
4) 對效能影響的領域:第一個是記憶體佔用空間的節省,另一個是垃圾回收機制執行記憶體清理時的執行時間增加
5) 在PHP執行中,一旦根緩衝區滿了或呼叫gc_collect_cycles() 函數時,就會執行垃圾回收。
相關推薦:
#以上是PHP之垃圾回收機制詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!