亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP線程的內存回收問題

2024-05-04 23:47:43
字體:
來源:轉載
供稿:網友

當一個PHP線程結束時,當前占用的所有內存空間都會被銷毀。那么如果這個線程不結束,怎么回收內存呢?

refcount:引用技術器,可以理解為指向該個容器的指針個數吧。

is_ref:是否被引用(只可能是0或者1)

賦值的流程:

<?php$a = 'aa';xdebug_debug_zval(a); //(refcount=1, is_ref=0),string 'aa' (length=6)$b = $a; //以下的兩個其實是一個變量容器xdebug_debug_zval(a); //(refcount=2, is_ref=0),string 'aa' (length=6)xdebug_debug_zval(b); //(refcount=2, is_ref=0),string 'aa' (length=6)unset($b); //對變量容器 refcount 減1xdebug_debug_zval(a); //(refcount=1, is_ref=0),string 'aa' (length=6)xdebug_debug_zval(b); //b: no such symbol b變量被銷毀,指向被斷掉,如果對應容器的引用技術為零,那么該塊兒內存被回收$b = $a;$b = 'bb';xdebug_debug_zval(a); //(refcount=1, is_ref=0),string 'aa' (length=6)xdebug_debug_zval(b); //(refcount=1, is_ref=0),string 'aa' (length=6) 重新申請一個變量容器存儲b,a的變量容器引用減1

引用的流程:

<?php$a = 'aa';xdebug_debug_zval('a'); //(refcount=1, is_ref=0),string 'aa' (length=2)$b = & $a;//變量容器的引用技術加1,引用標記置為1xdebug_debug_zval('a'); //(refcount=2, is_ref=1),string 'aa' (length=2)xdebug_debug_zval('b'); //(refcount=2, is_ref=1),string 'aa' (length=2)$b = '123'; //php會發現,該容器變量是引用(is_ref),所以容器變量不用像賦值那樣再申請一個xdebug_debug_zval('a'); //(refcount=2, is_ref=1),string '123' (length=2)xdebug_debug_zval('b'); //(refcount=2, is_ref=1),string '123' (length=2)unset($b);//變量容器應用計數減1,引用為零xdebug_debug_zval('a'); //(refcount=1, is_ref=0),string '123' (length=2)xdebug_debug_zval('b'); // b: no such symbol

那如果多次引用,unset掉一個,is_ref是否會被置為零,那樣bug不就出現了么?變量容器還是引用啊。那么我們來看看:

<?php$a = 'aa';$b = &$a;$c = &$a;//可以看到引用refCount是3,is_ref永遠是1xdebug_debug_zval('a'); //(refcount=3, is_ref=1),string 'aa' (length=2)xdebug_debug_zval('b'); //(refcount=3, is_ref=1),string 'aa' (length=2)xdebug_debug_zval('c'); //(refcount=3, is_ref=1),string 'aa' (length=2)unset($b);//我們期待的bug沒有出現,只是refcount減1,is_ref還是1xdebug_debug_zval('a'); //(refcount=2, is_ref=1),string 'aa' (length=2)xdebug_debug_zval('b'); // b: no such symbolxdebug_debug_zval('c'); //(refcount=2, is_ref=1),string 'aa' (length=2)//那php它怎么知道這個容器還有引用,畢竟is_ref仍然是1,不能計數,那么現在refcount就起作用了,是它告訴php,該變量有幾個引用,但問題又來了,如果我干點壞事,在引用的時候,又賦值,它會不會有bug$e = $a;//我們看到期望的bug還是沒出現,這時候再賦值,就不像直接賦值那么簡單refcount加1了,而是申請了一個新的變量容器xdebug_debug_zval('a'); //(refcount=2, is_ref=1),string 'aa' (length=2)xdebug_debug_zval('e'); //(refcount=1, is_ref=0),string 'aa' (length=2)

unset和賦值null都能回收變量么?很多人都錯認為,這兩個都能回收變量空間,其實錯了,null只是把變量占用的空間變小了,從回收上來說,該容器依然存在。

<?php$a = 'aa';$b = $a;$b = null;//又申請了一個變量容器xdebug_debug_zval('a'); //(refcount=1, is_ref=0),string 'aa' (length=2)xdebug_debug_zval('b'); //(refcount=1, is_ref=0),null 變量空間并沒被回收unset($b);//這時候才釋放了b變量容器的空間xdebug_debug_zval('a'); //(refcount=1, is_ref=0),string 'aa' (length=2)xdebug_debug_zval('b'); //b: no such symbol

總結

1. 垃圾回收的時機

PHP中,引用計數為0,則內存立刻釋放。也就是說,不存在環狀引用的變量,離開變量的作用域,內存被立刻釋放。環狀引用檢測則是在滿足一定條件下觸發,所以在上面的例子中,會看到使用的內存有大幅度的波動。也可以通過 gc_collect_cycles 函數來主動進行環狀引用檢測。

2. &符號的影響

顯式引用一個變量,會增加該內存的引用計數:

$a = "something";
$b = &$a;
此時unset($a), 但是仍有$b指向該內存區域的引用,內存不會釋放。

3. unset函數的影響

unset只是斷開一個變量到一塊內存區域的連接,同時將該內存區域的引用計數-1;在上面的例子中,循環體內部,$a=new A(); unset($a);并不會將$a的引用計數減到零;

4. = null 操作的影響;

$a = null 是直接將$a 指向的數據結構置空,同時將其引用計數歸0。

5. 腳本執行結束的影響

腳本執行結束,該腳本中使用的所有內存都會被釋放,不論是否有引用環。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人动漫网站在线观看| 韩国v欧美v日本v亚洲| 怡红院精品视频| 亚洲精品国产免费| 亚洲国产精品女人久久久| 午夜精品久久久久久久久久久久久| 中文字幕少妇一区二区三区| 最新国产精品拍自在线播放| 久久中文精品视频| 欧美亚州一区二区三区| 欧美精品video| 亚洲欧美日韩精品| 亚洲成年网站在线观看| 91精品国产综合久久男男| 性色av一区二区三区| 国产精品久久综合av爱欲tv| 在线日韩日本国产亚洲| 欧美久久精品一级黑人c片| 久久久久久久久亚洲| 欧美在线视频观看| 国产精品专区h在线观看| 国内精品中文字幕| 日本精品视频在线播放| 日韩极品精品视频免费观看| 亚洲欧美国产另类| 欧美日韩激情小视频| 久久香蕉频线观| 91理论片午午论夜理片久久| 日韩欧美亚洲综合| 国产精品极品在线| 日韩美女在线观看| 亚洲成人精品久久久| 亚洲国产精品悠悠久久琪琪| 亚洲黄色在线观看| 日韩在线观看免费高清| 久久91亚洲精品中文字幕| 性色av一区二区三区免费| 亚洲欧美日韩国产中文专区| 日韩影视在线观看| 日韩av一区二区在线| 久久免费国产精品1| 国产精品免费网站| 三级精品视频久久久久| 2019亚洲男人天堂| 亚洲精品国产电影| 欧美激情视频给我| 国产精品午夜视频| 欧美高清视频免费观看| 欧美极品少妇与黑人| 亚洲一区二区国产| 欧美性猛交xxxx免费看| 日韩av不卡在线| 中文字幕亚洲欧美日韩2019| 中文字幕久久久av一区| 精品国产一区久久久| 亚洲精品91美女久久久久久久| 精品一区二区亚洲| 亚洲精品国偷自产在线99热| 欧美午夜性色大片在线观看| 亚洲人成五月天| 亚洲精品99久久久久| 欧美黑人一区二区三区| 日韩在线欧美在线国产在线| 欧美性xxxx在线播放| 亚洲色图13p| 亚洲精品国产拍免费91在线| 最近2019年日本中文免费字幕| 欧美日韩国产一区中文午夜| 大桥未久av一区二区三区| 国产精品国模在线| 日本欧美一级片| 亚洲国产成人精品电影| 久久成人国产精品| 亚洲精品自拍视频| 欧美中文在线字幕| 成人疯狂猛交xxx| 色悠悠久久88| 久久久久久久一区二区| 热久久美女精品天天吊色| 91在线免费网站| 久久久久久久久久久成人| 欧美性xxxx极品高清hd直播| 亚洲视频欧美视频| 亚洲精品美女在线观看| 亚洲精品自在久久| 亚洲无av在线中文字幕| 久久乐国产精品| 欧美日韩色婷婷| 国模视频一区二区| 亚洲天堂开心观看| 久久91精品国产91久久久| 成人激情视频网| 海角国产乱辈乱精品视频| 久久久精品视频在线观看| 视频一区视频二区国产精品| 亚洲第一男人天堂| 亚洲欧洲视频在线| 亚洲国产成人在线播放| 色琪琪综合男人的天堂aⅴ视频| 日本国产欧美一区二区三区| 色噜噜狠狠狠综合曰曰曰| 色综合久久久888| 琪琪亚洲精品午夜在线| 日韩av中文字幕在线播放| 亚洲国产成人av在线| 另类色图亚洲色图| 色一情一乱一区二区| 久久综合国产精品台湾中文娱乐网| 国产日韩欧美成人| 久久精品一偷一偷国产| 亚洲视频axxx| 亚洲精美色品网站| 亚洲综合中文字幕在线观看| 日本精品一区二区三区在线| 美女av一区二区| 欧美亚洲在线播放| 久久精品国产一区二区电影| 国产精品99久久久久久久久| 91精品国产成人www| 日韩精品在线影院| 日韩电影免费在线观看中文字幕| 国产精品国模在线| 久久精品国产亚洲精品2020| 青青久久av北条麻妃海外网| 久久精品99久久久久久久久| 久久成人一区二区| 2018国产精品视频| 精品中文字幕在线2019| 96精品视频在线| 亚洲欧美日韩在线高清直播| 国产一区二区免费| 另类天堂视频在线观看| 91精品久久久久久久久久| 成人久久18免费网站图片| 亚洲成人999| 欧美日韩精品在线| 国产精品视频26uuu| 精品色蜜蜜精品视频在线观看| 午夜精品99久久免费| 久久久久久91| 精品久久久在线观看| 日韩av中文字幕在线播放| 欧美亚洲日本网站| 亚洲国产成人一区| 欧美大片在线看免费观看| 51久久精品夜色国产麻豆| 国产亚洲精品久久久优势| 欧美激情第三页| 亚洲女同精品视频| 日韩视频免费看| 中文字幕av一区二区三区谷原希美| 久久精品国产91精品亚洲| 亚洲影影院av| 综合av色偷偷网| 国产欧美va欧美va香蕉在线| 精品日本高清在线播放| 一区二区三区回区在观看免费视频| 秋霞av国产精品一区| 91在线免费看网站| 亚洲一区亚洲二区| 日韩美女福利视频| 精品中文字幕久久久久久| 国产精品第8页| 亚洲国产成人av在线|