婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 淺析PHP7 的垃圾回收機制

淺析PHP7 的垃圾回收機制

熱門標簽:江西手機自動外呼防封系統是什么 廣州防封卡外呼系統多少錢一個月 廣東地市地圖標注 怎么向銷售公司推銷外呼系統 仁和怎么申請400開頭的電話 哪里辦理400電話 高德地圖標注家 外呼系統撥打暫時無法接通 長春人工外呼系統服務商

垃圾回收機制

垃圾回收機制是一種動態存儲分配方案。它會自動釋放程序不再需要的已分配的內存塊。 自動回收內存的過程叫垃圾收集。垃圾回收機制可以讓程序員不必過分關心程序內存分配,從而將更多的精力投入到業務邏輯。 在現在的流行各種語言當中,垃圾回收機制是新一代語言所共有的特征。

垃圾的產生

PHP7 中復雜類型,像字符串、數組、對象等的數據結構中,頭部都有一個 gc, 這個 gc 的作用就是用來對垃圾回收的支持。當變量賦值、傳遞時,會增加 value 的引用數, unset、return 等釋放變量時再減掉引用數,減掉后如果發現 refcount 變為 0 則直接釋放 value,這是變量的基本回收過程。

不過有一種問題是這個機制無法解決的,就是循環引用的問題。

什么是循環引用呢? 簡單說就是變量的內部里存的 value 又引用了變量自身。 這種比較經常發生在數組和對象類型的變量上。

這里先講一下引用,即 zend_reference 這個類型,這個是 PHP7 新增的變量類型,當對變量使用 “” 操作時,會創建新的中間結構體 zend_reference,這個結構體會真正的指向對應的 value 結構。

舉個例子:

// 當進行如下賦值操作時
$a = 'hello'; // $a -> zend_string
$b = $a; // $b,$a -> zend_string
$c = $b; // $c,$b -> zval(type = IS_REFERENCE, refcount = 2) -> zend_string


最終會變成如下這樣:

 

即 $b 和 $c 的 zval 是通過中間結構體 zend_reference 再指向最終的 zend_string

回到循環引用的問題,舉個數組循環引用例子:

$arr = [1];
$a[] = $a;
unset($a);

使用 操作之后,變量 a 就變成了引用類型且引用計數 refcount 為 2,而又賦值給自己里面的元素,即變量 a 變成了自己引用自己。

具體如下如所示:

 

當 unset 之后就變成下圖這樣:

 

即 $a 所在的 zval 類型已經變成了 IS_UNDEF 了,zend_reference 結構體的引用計數減 1,但是仍然大于 0,這時候,這部分結構體就變成了垃圾,對此不處理的話,就可能會造成內存泄露。這里就需要垃圾收集器將這部分收集到緩沖區,之后進行回收處理。

回收過程

如果當變量的 refcount 減小后大于 0,PHP 并不會立即對這個變量進行垃圾鑒定和回收,而是放入一個緩沖區中,等這個緩沖區滿了以后(10000 個值)再統一進行處理,加入緩沖區的是變量 zend_value 里的 gc,目前垃圾只會出現在數組和對象兩種類型中,數組的情況上面已經介紹了,對象的情況則是成員屬性引用對象本身導致的,其它類型不會出現這種變量中的成員引用變量自身的情況,所以垃圾回收只會處理這兩種類型的變量。

gc 的結構 zend_refcounted_h 具體如下:

typedef struct _zend_refcounted_h {
  uint32_t     refcount; // 記錄 zend_value 的引用數
  union {
    struct {
      zend_uchar  type, // zend_value的類型, 與zval.u1.type一致
      zend_uchar  flags, 
      uint16_t   gc_info // GC信息,記錄在 gc 池中的位置和顏色,垃圾回收的過程會用到
    } v;
    uint32_t type_info;
  } u;
} zend_refcounted_h;

一個變量只能加入一次緩沖區,為了防止重復加入,變量加入后會把 zend_refcounted_h.gc_info 置為 GC_PURPLE,即標為紫色,后續不會重復插入。

垃圾緩沖區是一個雙向鏈表,等到緩存區滿了以后則啟動垃圾檢查過程:遍歷緩沖區,對當前變量的所有成員進行遍歷,然后把成員的 refcount 減 1 (如果成員還包含子成員則也進行遞歸遍歷,即深度優先遍歷),最后再檢查當前變量的引用,如果減為了 0 則為垃圾。這個算法的原理核心是:垃圾是由于成員引用自身導致的,那么就對所有的成員減一遍引用,如果發現最后變量本身的 refcount 變為了 0 則就表明其引用全部來自自身成員,即其他任何地方都不再使用它,那么它就是垃圾,需要被回收掉。反之說明不是垃圾,需要將其從緩沖區移出去。具體的過程如下:

(1) 從緩沖區鏈表的 roots 開始遍歷,把當前 value 標為灰色 (zend_refcounted_h.gc_info 置為 GC_GREY),然后對當前 value 的成員進行深度優先遍歷,把成員 value 的 refcount 減 1,并且也標為灰色;

(2) 重復遍歷緩沖區鏈表,檢查當前 value 引用是否為 0,為 0 則表示確實是垃圾,把它標為白色(GC_WHITE),如果不為 0 則排除了引用全部來自自身成員的可能,表示還有外部的引用,并不是垃圾,這時候因為步驟(1)對成員進行了 refcount 減 1 操作,需要再還原回去,對所有成員進行深度遍歷,把成員 refcount 加 1,同時標為黑色;

(3) 再次遍歷緩沖區鏈表,將非 GC_WHITE 的節點從 roots 鏈表中移出(移到待釋放的列表),最終 roots 鏈表中全部為真正的垃圾,最后將這些垃圾清除。

總結

以上所述是小編給大家介紹的PHP7 的垃圾回收機制,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

您可能感興趣的文章:
  • PHP垃圾回收機制的一些理解
  • PHP的垃圾回收機制代碼實例講解
  • PHP session垃圾回收機制實例分析
  • PHP進階學習之垃圾回收機制詳解
  • PHP析構函數destruct與垃圾回收機制的講解
  • 掌握PHP垃圾回收機制詳解
  • php中session垃圾回收機制
  • 總結PHP內存釋放以及垃圾回收
  • 解讀PHP中的垃圾回收機制
  • 析構函數與php的垃圾回收機制詳解
  • PHP中垃圾回收相關函數的使用

標簽:湘西 黔東 廈門 惠州 海北 梅河口 文山 濮陽

巨人網絡通訊聲明:本文標題《淺析PHP7 的垃圾回收機制》,本文關鍵詞  淺析,PHP7,的,垃圾,回收,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺析PHP7 的垃圾回收機制》相關的同類信息!
  • 本頁收集關于淺析PHP7 的垃圾回收機制的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美日韩国产美| 亚洲永久免费av| 国产成人夜色高潮福利影视| 一区二区三区中文在线| 中文一区在线播放| 久久在线免费观看| 欧美三级日韩在线| 色丁香久综合在线久综合在线观看| 国产在线播放一区二区三区| 三级久久三级久久| 图片区小说区国产精品视频| 亚洲激情六月丁香| 中文字幕视频一区二区三区久| 国产欧美一区二区三区在线看蜜臀| 日韩欧美在线综合网| 欧美顶级少妇做爰| 欧美日韩中字一区| 欧美喷潮久久久xxxxx| 欧美日韩一区在线观看| 欧美色综合网站| 国产精品国产三级国产有无不卡| 国产一区二区电影| 精品一区二区三区香蕉蜜桃| 奇米精品一区二区三区四区| 视频在线观看91| 日韩精品亚洲专区| 精品一区二区久久久| 精品一区二区三区视频在线观看| 美女视频黄久久| 另类小说色综合网站| 韩国欧美一区二区| 九九视频精品免费| 久久国产精品72免费观看| 亚洲国产欧美日韩另类综合 | 日本丶国产丶欧美色综合| 91久久精品日日躁夜夜躁欧美| av高清不卡在线| 欧日韩精品视频| 在线观看亚洲a| 欧美高清dvd| 日韩欧美成人一区二区| 久久综合久久综合久久| 国产精品国产三级国产aⅴ中文| 成人免费一区二区三区视频 | 丝袜美腿亚洲综合| 久久精品国产999大香线蕉| 日韩一区精品视频| 国产精品一卡二卡在线观看| 国产毛片精品视频| 日本伦理一区二区| 精品久久久网站| 亚洲欧美一区二区三区极速播放| 亚洲亚洲人成综合网络| 精品午夜一区二区三区在线观看| 国产成人丝袜美腿| 欧美视频一区二区三区四区| 欧美不卡一区二区三区| 日韩美女视频一区二区| 日本欧洲一区二区| 成人精品视频一区二区三区 | 国产不卡视频在线播放| 色婷婷综合久久久中文字幕| 欧美成人官网二区| 亚洲色欲色欲www| 麻豆国产精品官网| 92国产精品观看| 日韩午夜av电影| 亚洲综合色噜噜狠狠| 国产一区不卡在线| 日韩无一区二区| 国产精品福利在线播放| 日韩一区在线播放| 国产大陆a不卡| av午夜精品一区二区三区| 欧美高清hd18日本| 中文字幕一区二区三区在线不卡 | 亚洲欧美成人一区二区三区| 激情六月婷婷综合| 欧美日韩一区不卡| 欧美国产精品中文字幕| 久久99久久久欧美国产| 欧美亚洲国产bt| 亚洲欧美另类图片小说| 国产福利一区在线| 欧美在线播放高清精品| 亚洲视频一区二区在线| 粉嫩13p一区二区三区| 精品少妇一区二区三区在线视频| 亚洲福利一区二区三区| 北岛玲一区二区三区四区| 国产午夜三级一区二区三| 日韩精品国产精品| 精品视频色一区| 亚洲国产wwwccc36天堂| 一本色道久久综合精品竹菊| 国产精品对白交换视频 | 久久久不卡网国产精品一区| 亚洲高清久久久| 日本道色综合久久| 一区二区成人在线| 91美女福利视频| 亚洲欧美偷拍卡通变态| 91麻豆高清视频| 中文字幕一区二区三区四区不卡| 9l国产精品久久久久麻豆| 中文字幕欧美日本乱码一线二线| 国产成人免费视| 国产精品美女久久久久久久| av成人免费在线| 一区二区三区中文在线| 欧美色倩网站大全免费| 午夜伦理一区二区| 日韩一区二区三区视频在线| 麻豆精品一区二区综合av| 精品电影一区二区| 成人av网址在线| 一区二区在线观看不卡| 欧美一区三区四区| 韩国精品一区二区| 成人欧美一区二区三区1314| 在线一区二区视频| 免费成人美女在线观看| 久久久五月婷婷| 99精品久久久久久| 石原莉奈在线亚洲三区| 久久综合999| www.欧美.com| 日本成人在线视频网站| 国产香蕉久久精品综合网| 色婷婷狠狠综合| 蜜臀久久99精品久久久久宅男 | 欧美日韩三级一区| 久久亚洲私人国产精品va媚药| 国产精品亚洲综合一区在线观看| 亚洲欧洲精品一区二区三区 | 精品免费日韩av| 国产一区二区三区免费观看| 亚洲日本乱码在线观看| 99riav久久精品riav| 日韩av在线发布| 中文字幕不卡在线| 欧美挠脚心视频网站| 韩国一区二区在线观看| 亚洲欧美另类小说视频| 欧美电影免费观看完整版| 色哟哟精品一区| 国产一区二区福利| 石原莉奈一区二区三区在线观看 | 日韩精品专区在线影院重磅| 99精品国产热久久91蜜凸| 六月丁香婷婷久久| 亚洲与欧洲av电影| 亚洲国产精品精华液2区45| 这里只有精品免费| 色综合久久综合| 国产伦理精品不卡| 日韩av电影天堂| 一区二区三区四区激情| 国产欧美综合在线观看第十页| 色呦呦网站一区| www.综合网.com| 国产凹凸在线观看一区二区| 日本欧美一区二区三区乱码| 亚洲精品久久久蜜桃| 亚洲国产精品激情在线观看| 欧美成人猛片aaaaaaa| 91精品在线一区二区| 日本乱人伦aⅴ精品| av电影在线观看完整版一区二区| 国产福利不卡视频| 日韩专区在线视频| 亚洲综合网站在线观看| 欧美性大战久久久久久久蜜臀 | 日本美女一区二区| 亚洲在线一区二区三区| 中文字幕一区二区三区精华液 | 亚洲精品成a人| 国产精品欧美一级免费| 久久亚洲私人国产精品va媚药| 欧美一卡2卡3卡4卡| 日韩网站在线看片你懂的| 91精品国产综合久久久久久久| 欧美午夜影院一区| 欧美日韩综合不卡| 欧美三级电影网站| 7777精品伊人久久久大香线蕉完整版| 色美美综合视频| 欧美综合一区二区| 欧美精品xxxxbbbb| 在线播放中文字幕一区| 日韩欧美精品三级| 一本色道久久综合精品竹菊| 91久久线看在观草草青青| 色婷婷久久久亚洲一区二区三区| 欧美性大战xxxxx久久久| 欧美日韩国产精品自在自线| 欧美日本视频在线| 日韩欧美一区二区不卡| 国产三级一区二区| 亚洲欧美成aⅴ人在线观看|