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' //改變元素