[PHP] php5.3之前-php5.3-php7垃圾回收機制的進化

php5.3之前的版本 , 只有引用計數 , 如果遇到循環引用的情況  , 會出現內存泄露

比如這樣的代碼:

<?php
$arr=array("tao");
$arr[]=$a;

unset($arr)

雖然unset了$arr , 但是內存並不能回收 , 因爲有引用自身這樣的行爲

  

php5.3 之後的版本 , 有引用計數和同步週期回收算法

在引用計數的基礎上 , 增加了同步回收 , 把計數減-1 大於0的變量 , 塞入了root buffer這樣的根緩衝池 , 滿10000後 , 對池裏的變量進行回收操作 , 解決了上面的循環引用問題

 

php7之後的版本 , 優化了引用計數部分

簡單類型:bool(true/false), null, long,double ,值直接存儲在zval中 , 沒有引用計數

內部增加了一個引用類型 ,  變量爲對象類型 , 資源類型 , 引用類型時 , 會使用引用計數

字符串類型 , 區分臨時字符串 , 內部字符串 , 已知字符串 , 內部字串和已知字串,都會存在於php運行的整個週期,不涉及垃圾回收問題 , 沒有引用計數 , 臨時字符串有引用計數

 

 

 

數組分爲不可變數組和可變數組 ; 不可變數組引用計數初始爲2 , 往後會+1  ;  可變數組初始爲1 , 往後會+1

 

不可變數組:

元素是不可變元素的就是不可變數組 , 比如string, integer, float等

$arr=['tao','shihan']

 

可變數組:

1. 動態生成數組

2. 對不可變數組做任何改變(增減元素,改變元素值)

$arr=range(1,2)

$a = ['y', 'x']; $a[0]='tao'  //改變元素

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章