php5和php7垃圾回收上的區別php
PHP5和PHP7的垃圾回收機制都屬於引用計數,可是在複雜數據類型的算法處理上:PHP7中zval有了新的實現方式。算法
最基礎的變化就是 *zval 須要的內存再也不是單獨從堆上分配,再也不本身存儲引用計數。複雜數據類型(好比字符串、數組和對象)的引用計數由其自身來存儲。數組
這種實現方式有如下好處:php7
一、簡單數據類型不須要單獨分配內存,也不須要計數;spa
二、不會再有兩次計數的狀況。在對象中,只有對象自身存儲的計數是有效的;對象
三、因爲如今計數由數值自身存儲,因此也就能夠和非 zval 結構的數據共享,好比 zval 和 hashtable key 之間。blog
什麼叫作引用計數?內存
因爲PHP是用C來寫的,C裏面有一種東西叫作結構體,咱們PHP的變量在C中就是用這種方式存儲的。rem
每一個PHP的變量都存在於一個叫作zval的容器中,一個zval容器,除了包含變量名和值,還包括兩個字節的額外信息:字符串
● 一個叫作'is_ref',是個布爾值,用來表示這個變量是否屬於引用集合,經過這個字節,咱們php才能把普通變量和引用變量區分開來。
● 第二個額外字節就是'refcount',用來表示指向這個容器的變量的個數。
PHP5 與 PHP7 引用計數的對比
php 5.* 變量賦值等操做引用計數如圖所示,在倒數第二步,會造成一個循環引用,而且在 unset 操做以後,會產生垃圾。
PHP 7 的計數放到了具體的 value 中,zval 不存在寫時複製(寫時分離)。
而且 PHP 7 的有一個專門的 zend_reference 用來表示引用。