PHP 垃圾回收機制

 談論 PHP 垃圾回收機制,我們可以從以下三方面說起:

  1. 引用計數
  2. 回收週期
  3. 性能方面

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腳本此類。

性能方面文檔
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章