PHP記憶體回收機制

來源:互聯網
上載者:User

標籤:並且   記憶體回收   ...   操作   處理   nbsp   array   額外資訊   檢查   

實現記憶體回收機制的整個原因是為了通過清理循環參考的變數來節省記憶體佔用。

  1. 引用計數:php變數存在一個叫"zval"的變數容器中。一個zval變數容器,除了包含變數的類型和值,還包括兩個位元組的額外資訊:is_ref和refcount。is_ref是個bool值,用來標識這個變數是否是屬於引用集合,php引擎才能把普通變數和引用變數區分開來;refcount用以表示指向這個zval變數容器的變數個數,當refcount = 0意味著該變數可被清除或回收了
    <?php$a = array( ‘meaning‘ => ‘life‘, ‘number‘ => 42 );$a[‘life‘] = $a[‘meaning‘];xdebug_debug_zval( ‘a‘ );?>

    上常式輸出如下:

    a: (refcount=1, is_ref=0)=array (   ‘meaning‘ => (refcount=2, is_ref=0)=‘life‘,   ‘number‘ => (refcount=1, is_ref=0)=42,   ‘life‘ => (refcount=2, is_ref=0)=‘life‘)

     

     Xdebug的輸出顯示為兩個值為‘life‘的 zval 變數容器,其實是同一個:

    <?php$a = array( ‘one‘ );$a[] =& $a;xdebug_debug_zval( ‘a‘ );unset($a);xdebug_debug_zval( ‘a‘ );?>

    上例結果如下:

    (refcount=1, is_ref=1)=array (   0 => (refcount=1, is_ref=0)=‘one‘,   1 => (refcount=1, is_ref=1)=...)

     

    上例儘管不再有某個範圍中的任何符號指向這個變數容器,由於數組元素“1”仍然指向數組本身,所以這個容器不能被清除 。因為沒有另外的符號指向它,使用者沒有辦法清除這個結構,結果就會導致記憶體流失。php將在指令碼執行結束時清除這個資料結構,但是在php清除之前,將耗費不少記憶體

  2. 回收周期:可用來處理循環參考導致記憶體流失問題。如果一個變數容器引用計數增加,它將繼續被使用,當然就不再在垃圾中;如果引用計數減少到零,所在變數容器將被清除(free)。就是說,僅僅在引用計數減少到非零值時,才會產生垃圾周期(garbage cycle);其次,在一個垃圾周期中,通過檢查引用計數是否減1(類比),並且檢查哪些變數容器的引用次數是零,來發現哪部分是垃圾
  3. 開啟和關閉記憶體回收機制:除了修改配置zend.enable_gc ,也能通過分別調用gc_enable() 和 gc_disable()函數來開啟和關閉記憶體回收機制。另外,即使在記憶體回收機制不可用時,可能根也被記錄,這樣每次找到可能根後不檢查記憶體回收機制是否開啟,記錄操作更快,調用gc_collect_cycles()函數可強制執行循環回收。

PHP記憶體回收機制

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.