每個html' target='_blank'>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 則判定為垃圾 進行內存容器銷毀
相關推薦:
PHP的垃圾回收機制 可回收垃圾有哪些 垃圾回收 不可回收垃
PHP垃圾回收機制—引用計數的基本知識
以上就是php中的引用以及垃圾回收的分析的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答