本篇文章給大家帶來的內容是關於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( 'one' );$a[] =& $a;xdebug_debug_zval( 'a' );
a: (refcount=2, is_ref=1)=array ( 0 => (refcount=1, is_ref=0)='one', 1 => (refcount=2, is_ref=1)=...)
執行unset$a 會釋放變數與zval的記憶體關聯 但是閉環自己內部仍存在
(refcount=1, is_ref=1)=array ( 0 => (refcount=1, is_ref=0)='one', 1 => (refcount=1, is_ref=1)=...)
但是此時 沒有變數 能操作到 zval 容器 時間上此時 已經成為了記憶體垃圾 確無法釋放
回收機制:簡單來說 就是執行完指令碼後 對仍存在的變數 進行 整體資料全部refcount -1 如果減為0 則判定為垃圾 進行記憶體容器銷毀