談論 PHP 垃圾回收機制,我們可以從以下三方面說起:
- 引用計數
- 回收週期
- 性能方面
1、引用計數
在 PHP 中,每個變量都存在"zval"的變量容器中,這個變量包含變量的類型、值、is_ref、refcount。
- is_ref 是一個bool 值,用來標識這個變量是否是屬於引用集合,php引擎通過這個字段區分普通變量和引用變量,由於php允許用戶通過使用&來使用自定義引用,zval變量容器中還有一個內部引用計數機制,來優化內存使用。
- refcount 用以表示指向這個zval變量容器的變量個數。
PS:引用計數基本知識官網詳解
2、回收週期
基本規則:如果一個引用計數增加,它將繼續被使用,當然就不再在垃圾中。如果引用計數減少到零,所在變量容器將被清除(free)。就是說,僅僅在引用計數減少到非零值時,纔會產生垃圾週期(garbage cycle)。其次,在一個垃圾週期中,通過檢查引用計數是否減1,並且檢查哪些變量容器的引用次數是零,來發現哪部分是垃圾。
3、性能方面
主要有兩個領域對性能有影響。第一個是內存佔用空間的節省,另一個是垃圾回收機制執行內存清理時的執行時間增加。
實現垃圾回收機制的整個原因是爲了,一旦先決條件滿足,通過清理循環引用的變量來節省內存佔用。在PHP執行中,一旦根緩衝區滿了或者調用gc_collect_cycles() 函數時,就會執行垃圾回收。
通常,PHP中的垃圾回收機制,僅僅在循環回收算法確實運行時會有時間消耗上的增加。但是在平常的(更小的)腳本中應根本就沒有性能影響。
然而,在平常腳本中有循環回收機制運行的情況下,內存的節省將允許更多這種腳本同時運行在你的服務器上。因爲總共使用的內存沒達到上限。
這種好處在長時間運行腳本中尤其明顯,諸如長時間的測試套件或者daemon腳本此類。