淺談PHP記憶體回收機制____PHP

來源:互聯網
上載者:User
1.引用計數基本知識

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


當一個變數被賦常量值時,就會產生一個zval變數容器,如下例這樣:

<?php $a = "wusuopubupt";xdebug_debug_zval('a');$b = $a;xdebug_debug_zval('a');xdebug_debug_zval('b');unset($a);xdebug_debug_zval('a');xdebug_debug_zval('b');


輸出:

a:(refcount=1, is_ref=0),string 'wusuopubupt' (length=11)a:(refcount=2, is_ref=0),string 'wusuopubupt' (length=11)b:(refcount=2, is_ref=0),string 'wusuopubupt' (length=11)b:(refcount=1, is_ref=0),string 'wusuopubupt' (length=11)

可以看到,變數a 剛剛初始化時,refcount=1,變數a是在當前範圍中產生的。並且產生了類型為 string 和值為new string的變數容器。在額外的兩個位元組資訊中,"is_ref"被預設設定為 FALSE,因為沒有任何自訂的引用產生。"refcount" 被設定為 1,因為這裡只有一個變數a使用這個變數容器. 注意到當"refcount"的值是1時,"is_ref"的值總是FALSE. 
在未調用unset($a)之前,a,b的refcount(引用計數)均為2,因為這裡有2個變數(a,b)使用這個變數容器.
調用unset($a)後,refcount(a)=0,這時,a佔用的記憶體被free,此時refcount(b)=1,因為這裡只有一個變數b使用這個變數容器

2.記憶體回收機制

2.1 首先,我們先要建立一些基本規則,如果一個引用計數增加,它將繼續被使用,當然就不再在垃圾中。如果引用計數減少到零,所在變數容器將被清除(free)。就是說,僅僅在引用計數減少到非零值時,才會產生垃圾周期(garbage cycle)。其次,在一個垃圾周期中,通過檢查引用計數是否減1,並且檢查哪些變數容器的引用次數是零,來發現哪部分是垃圾。
2.2PHP中,引用計數refcount為0,則記憶體立刻釋放。也就是說,不存在環狀引用的變數,離開變數的範圍,記憶體被立刻釋放。環狀引用檢測則是在滿足一定條件下觸發,所以在上面的例子中,會看到使用的記憶體有大幅度的波動。也可以通過 gc_collect_cycles 函數來主動進行環狀引用檢測。


相關文章

聯繫我們

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