每個(gè)html' target='_blank'>php變量存在一個(gè)叫 zval 的變量容器中。一個(gè)zval變量容器,除了包含變量的類(lèi)型和值,還包括兩個(gè)字節(jié)的額外信息。第一個(gè)是 is_ref ,是個(gè)bool值,用來(lái)標(biāo)識(shí)這個(gè)變量是否是屬于引用集合(reference set)。通過(guò)這個(gè)字節(jié),php引擎才能把普通變量和引用變量區(qū)分開(kāi)來(lái),由于php允許用戶(hù)通過(guò)使用 來(lái)使用自定義引用,zval變量容器中還有一個(gè)內(nèi)部引用計(jì)數(shù)機(jī)制,來(lái)優(yōu)化內(nèi)存使用。第二個(gè)額外字節(jié)是 refcount ,用以表示指向這個(gè)zval變量容器的變量(也稱(chēng)符號(hào)即symbol)個(gè)數(shù)。所有的符號(hào)存在一個(gè)符號(hào)表中,其中每個(gè)符號(hào)都有作用域(scope),那些主腳本(比如:通過(guò)瀏覽器請(qǐng)求的的腳本)和每個(gè)函數(shù)或者方法也都有作用域。
//php中對(duì)象為引用傳遞
is_ref = 0, refcount = 0 zval容器會(huì)在腳本執(zhí)行結(jié)束時(shí)被銷(xiāo)毀
引用官方的例子
?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)=...)

執(zhí)行unset$a 會(huì)釋放變量與zval的內(nèi)存關(guān)聯(lián) 但是閉環(huán)自己內(nèi)部仍存在
(refcount=1, is_ref=1)=array ( 0 = (refcount=1, is_ref=0)= one , 1 = (refcount=1, is_ref=1)=...)

但是此時(shí) 沒(méi)有變量 能操作到 zval 容器 時(shí)間上此時(shí) 已經(jīng)成為了內(nèi)存垃圾 確無(wú)法釋放
回收機(jī)制:簡(jiǎn)單來(lái)說(shuō) 就是執(zhí)行完腳本后 對(duì)仍存在的變量 進(jìn)行 整體數(shù)據(jù)全部refcount -1 如果減為0 則判定為垃圾 進(jìn)行內(nèi)存容器銷(xiāo)毀
相關(guān)推薦:
PHP的垃圾回收機(jī)制 可回收垃圾有哪些 垃圾回收 不可回收垃
PHP垃圾回收機(jī)制—引用計(jì)數(shù)的基本知識(shí)
以上就是php中的引用以及垃圾回收的分析的詳細(xì)內(nèi)容,PHP教程
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注