PHP記憶體回收機制

來源:互聯網
上載者:User

標籤:不同   number   object   區分   它的   容器   成員   最佳化   就會   

1.PHP記憶體回收機制主要用到了引用計數概念。
在每個變數產生的時候後存在於一個叫做“ZAVAL”的變數容器裡面。一個zval變數容器,除了包含變數的類型和值,還包括兩個位元組的額外資訊。第一個是"is_ref",是個bool值,用來標識這個變數是否是屬於引用集合(reference set)。通過這個位元組,php引擎才能把普通變數和引用變數區分開來,由於php允許使用者通過使用&來使用自訂引用,zval變數容器中還有一個內部引用計數機制,來最佳化記憶體使用量。第二個額外位元組是"refcount",用以表示指向這個zval變數容器的變數(也稱符號即symbol)個數。當refcount=0時,則出發記憶體回收,將這個變數銷毀。
例如:
<?php
$a = "new string";
?>
如果開啟了Xdebug,則可以使用xdebug_debug_zval()函數顯示is_ref和refcount的值。
<?php
xdebug_debug_zval(‘a‘);
?>
輸出:a: (refcount=1, is_ref=0)=‘new string‘
把一個變數賦值給另一變數將增加引用次數(refcount).
當沒必要時,php不會去複製已產生的變數容器。變數容器在”refcount“變成0時就被銷毀. 當任何關聯到某個變數容器的變數離開它的範圍(比如:函數執行結束),或者對變數調用了函數 unset()時,”refcount“就會減1。
當考慮像 array和object這樣的複合類型時,事情就稍微有點複雜. 與 標量(scalar)類型的值不同,array和 object類型的變數把它們的成員或屬性存在自己的符號表中。這意味著下面的例子將產生三個zval變數容器。
<?php
$a = array( ‘meaning‘ => ‘life‘, ‘number‘ => 42 );
xdebug_debug_zval( ‘a‘ );
?>
輸出:
a: (refcount=1, is_ref=0)=array (
‘meaning‘ => (refcount=1, is_ref=0)=‘life‘,
‘number‘ => (refcount=1, is_ref=0)=42
)
刪除數組中的一個元素,就是類似於從範圍中刪除一個變數. 刪除後,數組中的這個元素所在的容器的“refcount”值減少,同樣,當“refcount”為0時,這個變數容器就從記憶體中被刪除。

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.