日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解PHP的引用計數

瀏覽:22日期:2022-09-07 15:49:57
什么是引用計數

在PHP的數據結構中,引用計數就是指每一個變量,除了保存了它們的類型和值之外,還額外保存了兩個內容,一個是當前這個變量是否被引用,另一個是引用的次數。為什么要多保存這樣兩個內容呢?當然是為了垃圾回收(GC)。也就是說,當引用次數為0的時候,這個變量就沒有再被使用了,就可以通過 GC 來進行回收,釋放占用的內存資源。任何程序都不能無限制的一直占用著內存資源,過大的內存占用往往會帶來一個嚴重的問題,那就是內存泄露,而 GC 就是PHP底層自動幫我們完成了內存的銷毀,而不用像 C 一樣必須去手動地 free 。

怎么查看引用計數?

我們需要安裝 xdebug 擴展,然后使用 xdebug_debug_zval() 函數就可以看到指定內存的詳細信息了,比如:

$a = 'I am a String';xdebug_debug_zval(’a’);// a: (refcount=1, is_ref=0)=’I am a String’

從上述內容中可以看出,這個 $a 變量的內容是 I am a String 這樣一個字符串。而括號中的 refcount 就是引用次數,is_ref 則是說明這個變量是否被引用。我們通過變量賦值來看看這個兩個參數是如何變化的。

$b = $a;xdebug_debug_zval(’a’);// a: (refcount=1, is_ref=0)=’I am a String’$b = &$a;xdebug_debug_zval(’a’);// a: (refcount=2, is_ref=1)=’I am a String’

當我們進行普通賦值后,refcount 和 is_ref 沒有任何變化,但當我們進行引用賦值后,可以看到 refcount 變成了2,is_ref 變成了1。這也就是說明當前的 a 變量被引用賦值了,它的內存符號表服務于a變量被引用賦值了,它的內存符號表服務于a 和 $b 兩個變量。

$c = &$a;xdebug_debug_zval(’a’);// a: (refcount=3, is_ref=1)=’I am a String’unset($c, $b);xdebug_debug_zval(’a’);// a: (refcount=1, is_ref=1)=’I am a String’$b = &$a;$c = &$a;$b = 'I am a String new';xdebug_debug_zval(’a’);// a: (refcount=3, is_ref=1)=’I am a String new’unset($a);xdebug_debug_zval(’a’);// a: no such symbol

繼續增加一個 c 的引用賦值,可以看到 refcount 會繼續增加。然后 unset 掉c的引用賦值,可以看到refcount會繼續增加。然后unset掉b 和 $c 之后,refcount 恢復到了1,不過這時需要注意的是,is_ref 依然還是1,也就是說,這個變量被引用過,這個 is_ref 就會變成1,即使引用的變量都已經 unset 掉了這個值依然不變。

最后我們 unset 掉 $a ,顯示的就是 no such symbol 了。當前變量已經被銷毀不是一個可以用的符號引用了。(注意,PHP中的變量對應的是內存的符號表,并不是真正的內存地址)

對象的引用計數

和普通類型的變量一樣,對象變量也是使用同樣的計數規則。

// 對象引用計數class A{}$objA = new A();xdebug_debug_zval(’objA’);// objA: (refcount=1, is_ref=0)=class A { }$objB = $objA;xdebug_debug_zval(’objA’);// objA: (refcount=2, is_ref=0)=class A { }$objC = $objA;xdebug_debug_zval(’objA’);// objA: (refcount=3, is_ref=0)=class A { }unset($objB);class C{}$objC = new C;xdebug_debug_zval(’objA’);// objA: (refcount=1, is_ref=0)=class A { }

不過這里需要注意的是,對象的符號表是建立的連接,也就是說,對 objC 進行重新實例化或者修改為 NULL ,并不會影響objC進行重新實例化或者修改為NULL,并不會影響objA 的內容,對象進行普通賦值操作也是引用類型的符號表賦值,所以我們不需要加 & 符號。

數組的引用計數

// 數組引用計數$arrA = [ ’a’=>1, ’b’=>2,];xdebug_debug_zval(’arrA’);// arrA: (refcount=2, is_ref=0)=array (// ’a’ => (refcount=0, is_ref=0)=1, // ’b’ => (refcount=0, is_ref=0)=2// )$arrB = $arrA;$arrC = $arrA;xdebug_debug_zval(’arrA’);// arrA: (refcount=4, is_ref=0)=array (// ’a’ => (refcount=0, is_ref=0)=1, // ’b’ => (refcount=0, is_ref=0)=2// )unset($arrB);$arrC = [’c’=>3];xdebug_debug_zval(’arrA’);// arrA: (refcount=2, is_ref=0)=array (// ’a’ => (refcount=0, is_ref=0)=1, // ’b’ => (refcount=0, is_ref=0)=2// )// 添加一個已經存在的元素$arrA[’c’] = &$arrA[’a’];xdebug_debug_zval(’arrA’);// arrA: (refcount=1, is_ref=0)=array (// ’a’ => (refcount=2, is_ref=1)=1, // ’b’ => (refcount=0, is_ref=0)=2, // ’c’ => (refcount=2, is_ref=1)=1// )

調試數組的時候,我們會發現兩個比較有意思的事情。

一是數組內部的每個元素又有單獨的自己的引用計數。這也比較好理解,每一個數組元素都可以看做是一個單獨的變量,但數組就是這堆變量的一個哈希集合。如果在對象中有成員變量的話,也是一樣的效果。當數組中的某一個元素被 & 引用賦值給其他變量之后,這個元素的 refcount 會增加,不會影響整個數組的 refcount 。

二是數組默認上來的 refcount 是2。其實這是 PHP7 之后的一種新的特性,當數組定義并初始化后,會將這個數組轉變成一個不可變數組(immutable array)。為了和普通數組區分開,這種數組的 refcount 是從2開始起步的。當我們修改一下這個數組中的任何元素后,這個數組就會變回普通數組,也就是 refcount 會變回1。這個大家可以自己嘗試下,關于為什么要這樣做的問題,官方的解釋是為了效率,具體的原理可能還是需要深挖 PHP7 的源碼才能知曉。

關于內存泄露需要注意的地方

其實 PHP 在底層已經幫我們做好了 GC 機制就不需要太關心變量的銷毀釋放問題,但是,千萬要注意的是對象或數組中的元素是可以賦值為自身的,也就是說,給某個元素賦值一個自身的引用就變成了循環引用。那么這個對象就基本不太可能會被 GC 自動銷毀了。

// 對象循環引用class D{ public $d;}$d = new D;$d->d = $d;xdebug_debug_zval(’d’);// d: (refcount=2, is_ref=0)=class D { // public $d = (refcount=2, is_ref=0)=... // }// 數組循環引用$arrA[’arrA’] = &$arrA;xdebug_debug_zval(’arrA’);// arrA: (refcount=2, is_ref=1)=array (// ’a’ => (refcount=0, is_ref=0)=1, // ’b’ => (refcount=0, is_ref=0)=2, // ’arrA’ => (refcount=2, is_ref=1)=...// )

不管是對象還是數組,在打印調試時出現了 ... 這樣的省略號,那么你的程序中就出現了循環引用。所以這個問題應該是我們在日常開發中應該時刻關注的問題。

總結

引用計數是了解垃圾回收機制的前提條件,而且正是因為現代語言中都有一套類似的垃圾回收機制才讓我們的編程變得更加容易且安全。那么有人說了,日常開發根本用不到這些呀?用不到不代表不應該去學習,就像循環引用這個問題一樣,當代碼中充斥著大量的類似代碼時,系統崩潰只是遲早的事情,所以,這些知識是我們向更高級的程序進階所不可或缺的內容。

測試代碼: github.com/zhangyue050…

以上就是詳解PHP的引用計數的詳細內容,更多關于PHP的引用計數的資料請關注好吧啦網其它相關文章!

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美精品一二| 免费久久99精品国产| 午夜在线播放视频欧美| 欧美~级网站不卡| 亚洲午夜黄色| 免费精品视频在线| 国产日韩视频在线| 免费在线欧美黄色| 欧美日韩国产观看视频| 999国产精品视频| 中文在线日韩| 久久婷婷国产| 婷婷六月综合| 国产丝袜一区| 成人精品视频| 久久最新视频| 久久av影视| 精品国产乱码久久久| 欧美精选一区二区三区| 午夜亚洲福利| 国语精品一区| 亚洲永久精品唐人导航网址| 你懂的国产精品永久在线| 亚洲黑丝一区二区| 国产精品久久久久av蜜臀 | 国产日韩一区| 欧美不卡视频| 国产精品极品| 丝袜美腿亚洲一区| 中文在线免费视频| 视频一区视频二区中文| 欧美激情99| 亚州欧美在线| 国产精品99一区二区| 欧美激情福利| 欧美日韩一视频区二区| 一区在线免费| 日韩一区电影| 你懂的国产精品| 国产探花一区| 日韩毛片一区| 宅男噜噜噜66国产日韩在线观看| 精品日韩一区| 美日韩一区二区三区| 日韩av中文字幕一区二区| 色吊丝一区二区| 精品亚洲精品| 国产欧美久久一区二区三区| 天堂av在线一区| 欧美日韩国产在线一区| 精品中文字幕一区二区三区av| 成人在线视频区| 国产高清视频一区二区| 欧美日韩中文| 另类综合日韩欧美亚洲| 国产精品一区二区av日韩在线| 亚洲影视一区| 日韩av中文在线观看| 国产亚洲一区二区三区啪| 欧美一区网站| 国产日韩欧美一区在线| 日韩不卡一二三区| 国产精品中文字幕亚洲欧美| 国产精品蜜月aⅴ在线| 精品国产乱码久久久久久1区2匹| 国产一区丝袜| 欧美成人午夜| 蜜桃av一区二区三区电影| 日韩国产精品久久久久久亚洲| 青草av.久久免费一区| 国产精品v亚洲精品v日韩精品| 久久中文字幕导航| 日韩在线短视频| 亚洲在线成人| 欧美一区不卡| 国产精品久av福利在线观看| 久久午夜影院| 欧美 日韩 国产一区二区在线视频 | 亚洲精品女人| 国产精品传媒麻豆hd| 精品一区二区三区四区五区| 久久久久国产| 视频一区中文字幕精品| 欧美片网站免费| jizzjizz中国精品麻豆| 黑丝一区二区三区| 国产精品免费精品自在线观看| 欧美成人基地 | 色吊丝一区二区| 欧美影院精品| 欧美日韩在线播放视频| 日本色综合中文字幕| 亚洲91视频| 国产午夜一区| 男女男精品网站| 国产福利资源一区| 亚洲视频电影在线| 成人日韩在线| 老牛国内精品亚洲成av人片| 国产精品日韩久久久| 精品入口麻豆88视频| 一区二区三区国产盗摄| 日韩久久精品| 嫩草伊人久久精品少妇av杨幂| 亚洲国产一区二区三区在线播放 | 欧美日韩国产综合网| 电影91久久久| 国产精品网站在线看| 亚洲成人日韩| 国产麻豆久久| av资源亚洲| 日韩av在线播放网址| 久久国产欧美日韩精品| 亚洲一区有码| 久久亚洲欧洲| 性欧美精品高清| 99国内精品| 狠狠色综合网| 久久亚洲视频| 亚洲乱码视频| 综合激情在线| 在线精品国产亚洲| 免费成人在线视频观看| 欧美片第1页| 92国产精品| 日韩精品第一区| 色老板在线视频一区二区| 欧美freesex黑人又粗又大| 播放一区二区| 一区福利视频| 蜜臀久久99精品久久久久宅男 | 国产另类在线| 精品日本视频| 久久激情网站| 亚洲综合三区| 天海翼精品一区二区三区| 亚洲精品在线国产| 国产剧情在线观看一区| 日韩成人免费| 午夜精品一区二区三区国产| 亚洲精品综合| 国产在线视频欧美一区| 91精品国产福利在线观看麻豆| 午夜久久一区| 国产日韩一区二区三免费高清| 精品国产aⅴ| 婷婷亚洲五月色综合| 国产一卡不卡| 亚洲激情久久| 国产精品玖玖玖在线资源| 老司机精品视频在线播放| 成人在线网站| 欧美日韩1区2区3区| 欧美精品日日操| 日本va欧美va精品| 人人香蕉久久| 日韩av中文字幕一区| 日韩欧美网址| 日本特黄久久久高潮| 欧美成人午夜| 国模大尺度视频一区二区| 国产亚洲在线观看| 精品日产乱码久久久久久仙踪林| 欧美另类综合| 国产精品国产三级国产在线观看| 国产精品99一区二区| 国产精品一区二区中文字幕| 亚洲成人免费| 欧洲一区二区三区精品| 久久国产精品免费一区二区三区| 99久久精品网站| 美女视频黄久久| 日韩极品在线观看| 九一国产精品| 99精品在线免费在线观看| 国产一区二区三区四区五区| 日韩欧美在线精品| 日韩精品一级中文字幕精品视频免费观看 | 亚洲欧美专区| 在线亚洲精品| 欧美.日韩.国产.一区.二区| 精品91福利视频| 国产精品黄色片| 国产探花一区在线观看| 日韩二区三区四区| 亚洲精品护士| 亚洲香蕉久久| 免费在线观看精品| 蜜桃久久久久久久| 亚洲资源网站| 中文字幕免费精品| 蜜臀a∨国产成人精品| 首页亚洲欧美制服丝腿| 亚洲欧美视频一区二区三区| 免费成人网www| 中文日韩欧美| 日本aⅴ免费视频一区二区三区| 综合在线一区| 国产日韩一区| 裤袜国产欧美精品一区|