首頁  >  文章  >  後端開發  >  php中的引用以及垃圾回收的分析

php中的引用以及垃圾回收的分析

不言
不言原創
2018-09-04 17:43:591348瀏覽

這篇文章帶給大家的內容是關於php中的引用以及垃圾回收的分析,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

每個php變數存在一個叫做"zval"的變數容器中。一個zval變數容器,除了包含變數的類型和值,還包括兩個位元組的額外資訊。第一個是"is_ref",是個bool值,用來識別這個變數是否是屬於引用集合(reference set)。透過這個位元組,php引擎才能把普通變數和引用變數區分開來,由於php允許使用者透過使用&來使用自訂引用,zval變數容器中還有一個內部引用計數機制,來優化記憶體使用。第二個額外位元組是"refcount",用以表示指向這個zval變數容器的變數(也稱為符號即symbol)個數。所有的符號存在一個符號表中,其中每個符號都有作用域(scope),那些主腳本(例如:透過瀏覽器請求的的腳本)和每個函數或方法也都有作用域。

//php中物件為引用傳遞

is_ref = 0, refcount = 0 zval容器會在腳本執行結束時被銷毀

引用官方的範例

<?php
$a = array( &#39;one&#39; );
$a[] =& $a;
xdebug_debug_zval( &#39;a&#39; );
a: (refcount=2, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)='one',
   1 => (refcount=2, is_ref=1)=...
)

自引用(curcular reference,自己是自己的一个元素)的数组的zval

 

執行unset$a 會釋放變數與zval的記憶體關聯但是閉環自己內部仍存在

(refcount=1, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)=&#39;one&#39;,
   1 => (refcount=1, is_ref=1)=...
)

Zvals after removal of array with a circular reference demonstrating the memory leak

但是此時沒有變數能操作到zval 容器時間上此時已經成為了記憶體垃圾確無法釋放

回收機制:簡單來說就是執行完腳本後對仍存在的變數進行整體資料全部refcount -1 如果減為0 則判定為垃圾進行記憶體容器銷毀

#相關推薦:

PHP的垃圾回收機制可回收垃圾有哪些垃圾回收不可回收佈列

PHP垃圾回收機制—引用計數的基本知識

以上是php中的引用以及垃圾回收的分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn