php中的引用以及記憶體回收的分析

來源:互聯網
上載者:User
本篇文章給大家帶來的內容是關於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 則判定為垃圾 進行記憶體容器銷毀

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.